【发布时间】:2017-06-17 02:04:15
【问题描述】:
我正在尝试使用承诺来防止在 UI 路由器 $resolve 中加载状态。
$stateProvider.state('base.restricted', {
url:'/restricted',
templateUrl: 'views/restricted.html',
controller: 'restrictedCtrl',
resolve: { // user must be logged-in to proceed
// authentication service checks session on back-end
authenticate: function ($q, $state, $timeout, AuthService){
AuthService.validate(token).then(function(res){
if( res.data.response.status===1 ) { // authenticated!
return $q.resolve(); // load state
} else { // authentication failed :(
$timeout(function() { $state.go('base.notfound') }); // load not found page
return $q.reject(); // do not load state
}
});
}
}
})
该方案的工作原理是根据身份验证结果重定向用户,但看起来,在身份验证失败后,控制器仍会在短时间内加载,然后将用户重定向到“未找到”状态.
我相信原因是因为我在解析中运行AuthService,但是以异步方式。因此,控制器在 AuthService 执行其操作时被加载,但在回调函数执行后被重定向。
但是resolve 不是天生就应该阻塞的吗?也就是说,直到resolve被“解决”后,控制器才会加载?
AuthService 基本上是这样的,仅供参考:
.service('AuthService', function($http){
this.validate = function(token){
return $http.get('http://my.api/validate/'+token);
}
});
如何修改此代码以防止在AuthService 的回调函数完成之前加载。
【问题讨论】:
标签: javascript angularjs promise angular-ui-router angular-promise