2016-03-02 76 views
0

我在我的AngularJS應用程序中使用app.run()來檢查用戶是否在顯示站點之前登錄,以阻止訪問各種網站,註冊用戶。我試着用promise來做,因爲在之前,每當我重載頁面時,isLoggedIn函數都會返回false,getStatus還沒有從服務器返回答案。AngularJS:app.run()中的承諾永久卡在循環中

現在使用承諾,該網站只是永遠調用自己在一個循環中,我猜是因爲當承諾解決時,過程只是重複自己。我哪裏錯了,我該如何解決這個問題?在此先感謝,非常感謝幫助!

這是我在app.js代碼:

app.run(function($rootScope, $state, authService){ 
    $rootScope.$on('$stateChangeStart', function(event, next, nextParams, from, fromParams){ 
     event.preventDefault(); 
     authService.getUserStatus().then(function(){ 
     console.log(authService.isLoggedIn()); 
     if(next.access.restricted && !authService.isLoggedIn()){ 
      $state.go('index', {}, { reload: true }); 
     } else { 
      $state.go(next, {}, { reload: true }); 
     } 
     }); 
    }); 
    }); 

這裏的服務authService.js:

(function(){ 
    var app = angular.module('labelcms'); 
    app.factory('authService', ['$q', '$timeout', '$http', function($q, $timeout, $http){ 

    var user = null; 

    var isLoggedIn = function(){ 
     if(user){ 
     return true; 
     } else { 
     return false; 
     } 
    }; 

    var getUserStatus = function(){ 
     var deferred = $q.defer(); 

     $http.get('/api/user/status') 
     .success(function(data){ 
      if(data.status){ 
      user = data.status; 
      deferred.resolve(); 
      } else { 
      user = false; 
      deferred.resolve(); 
      } 
     }) 
     .error(function(data){ 
      console.log('Error: ' + data); 
      user = false; 
      deferred.resolve(); 
     }); 

     return deferred.promise; 
    }; 

    return ({ 
     isLoggedIn: isLoggedIn, 
     getUserStatus: getUserStatus, 
     login: login, 
     logout: logout, 
     signup: signup 
    }); 

    }]); 
})(); 
+0

不應需要作出的要求,或阻止默認情況下,如果用戶已經登錄 – charlietfl

+0

但用戶每次頁面重新加載被設定時間回假,所以我要呼籲每個頁面請求的API 。有沒有更好的方式來存儲角度的用戶登錄? – cursedphil

+0

那麼'isLoggedIn()'有什麼意義呢?爲什麼你需要檢查不受限制的區域?最好的方法是在路由器的父狀態中使用'resolve',其中父路由器用於受限區域。如果父解決方案被拒絕,子狀態無法訪問 – charlietfl

回答

0

它循環,因爲每次執行$state.go(next, {}, { reload: true });它將再次打你$rootScope.$on

在您進入安全服務部門之前,我會檢查我們是否確實在限制路線上。

app.run(function($rootScope, $state, authService){ 
    $rootScope.$on('$stateChangeStart', function(event, next, nextParams, from, fromParams){ 
     if(!next.access.restricted) return; 
     authService.getUserStatus().then(function(){ 
     console.log(authService.isLoggedIn()); 
     if(!authService.isLoggedIn()){ 
      $state.go('index', {}, { reload: true }); 
     }); 
    }); 
    }); 
+0

這就是我所假設的,我只是不知道任何方式。檢查它是否處於受限狀態後的返回非常流暢,但是一旦遇到受限制的路由,它會不會再次陷入循環? – cursedphil

+0

那麼,如果你想防止默認,然後再次重定向 - 它會,我刪除防止在以後的編輯默認。所以現在它只會停留在那裏,如果你的索引路線受到限制(不應該是這樣) – SSH

+0

工程就像一個魅力,歡呼:) – cursedphil