Angular UI-Router - 在解决方案中返回被拒绝的promise不会停止状态转换

Nic*_*ick 14 javascript angularjs angular-ui-router

我试图确保用户在允许用户转换到特定状态之前进行身份验证.据我所知(在审查其他帖子之后),如果状态的resolve返回被拒绝的promise并且应该引发'$ stateChangeError'事件,则不应该发生状态转换.然而,这不是我所经历的.

单步执行以下代码,我可以看到延迟的promise被拒绝,但仍然发生状态转换,并且未触发'$ stateChangeError'.在我的模块的配置中,我有以下状态:

 .state('accounts', {
            url: '/Accounts',
            controller: 'AccountsController',
            templateUrl: 'Scripts/angular/accounts/templates/accounts.tpl.html',
            resolve: {
                authenticated: ['$q', 'AccountService', function ($q, accountService) {
                    var deferred = $q.defer();
                    accountService.userLoggedIn().then(function (loggedIn) {
                        if (loggedIn) {
                            deferred.resolve();
                        } else {
                            deferred.reject('Not logged in'); <-- This happens
                        }
                        return deferred.promise;
                    });
                }]
            }
        })
Run Code Online (Sandbox Code Playgroud)

在同一个模块中,在run函数中我有:

 $rootScope.$on('$stateChangeError',
    function (event, toState, toParams, fromState, fromParams, error) {
        $log.debug(error); <-- This is never called
        $state.go('login');
    });
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

Eva*_*bbs 20

你在错误的地方归还了诺言.Authenticated需要是一个返回promise的函数,但是你只是在.then()函数中返回promise,然后验证返回undefined:

        resolve: {
            authenticated: ['$q', 'AccountService', function ($q, accountService) {
                var deferred = $q.defer();
                accountService.userLoggedIn().then(function (loggedIn) {
                    if (loggedIn) {
                        deferred.resolve();
                    } else {
                        deferred.reject('Not logged in'); <-- This happens
                    }
                });

                return deferred.promise;

            }]
        }
Run Code Online (Sandbox Code Playgroud)

  • 哎呦!好眼睛. (2认同)

Sav*_*ipt 7

你不需要创建新的延迟,因为你已经从userLoggedIn()获得了承诺:

resolve: {
    authenticated: ['$q', 'AccountService', function ($q, accountService) {

        return accountService.userLoggedIn().then(function (loggedIn) {
              if (loggedIn) {
                   return loggedIn;
              } else {
                   return $q.reject('Not logged in'); 
              }
        });

     }]
}
Run Code Online (Sandbox Code Playgroud)