我在我的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
});
}]);
})();
不應需要作出的要求,或阻止默認情況下,如果用戶已經登錄 – charlietfl
但用戶每次頁面重新加載被設定時間回假,所以我要呼籲每個頁面請求的API 。有沒有更好的方式來存儲角度的用戶登錄? – cursedphil
那麼'isLoggedIn()'有什麼意義呢?爲什麼你需要檢查不受限制的區域?最好的方法是在路由器的父狀態中使用'resolve',其中父路由器用於受限區域。如果父解決方案被拒絕,子狀態無法訪問 – charlietfl