AngularJS:app.run() 中的承诺永远陷入循环

AngularJS: Promise in app.run() stuck in loop forever

本文关键字:永远 承诺 循环 app run AngularJS      更新时间:2023-09-26

我在我的 AngularJS 应用程序中使用 app.run() 来检查用户是否已登录,然后再显示站点以阻止非注册用户访问各种站点。我尝试用承诺来做这件事,因为以前,每当我重新加载页面时,isLoggedIn 函数都会返回 false,getStatus 还没有从服务器返回答案。

现在使用承诺,网站只是永远在循环中调用自己,我猜是因为当承诺得到解决时,这个过程会重复自己。我哪里出错了,我该如何解决这个问题?提前感谢,非常感谢帮助!

这是我在应用程序中的代码.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 });
        }
      });
    });
  });

以下是服务身份验证服务.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
    });
  }]);
})();

它循环是因为每次执行$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 });
      });
    });
  });