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

时间:2016-03-02 00:09:52

标签: javascript angularjs node.js express promise

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

现在使用承诺,网站只是永远地调用自己,我猜是因为当承诺得到解决时,该过程只会重复。我哪里出错了,我怎么能解决这个问题?在此先感谢,非常感谢帮助!

这是我在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
    });

  }]);
})();

1 个答案:

答案 0 :(得分: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 });
      });
    });
  });