我有一个决心,但控制器似乎在它完成之前就已经运行了。
$stateProvider.state('index', {
url: '/',
templateUrl: '/angular/general/index.general.html',
resolve: {
data: function(currentUser){
currentUser.resolveLogin();
}
},
controller: ['$state', 'currentUser', function($state, currentUser){
console.log('3');
if (currentUser.bLoggedIn()){
$state.go('index.dashboard');
}
}]
});
在currentUser中
this.resolveLogin = function(){
var deferred = $q.defer();
console.log('1')
$http.get('/profile')
.success(function(res){
console.log('2.1')
root.user = res.data;
deferred.resolve();
})
.error(function(res){
console.log('2.2')
deferred.reject();
});
// return promise object
return deferred.promise;
}
不是按1,2,1,3的顺序记录,而是按1,3,2.1的顺序记录。
答案 0 :(得分:0)
您忘记了解析函数中的返回保证,因此angular不应等待它。
因此,如果currentUser.resolveLogin();
返回承诺,您应该将其返回
resolve: {
data: function(currentUser){
return currentUser.resolveLogin();
}
},
旁注: $http
已经返回承诺,因此,您不需要手动创建它,并且可以将this.resolveLogin
缩减为此类
this.resolveLogin = function(){
console.log('1')
return $http.get('/profile')
.success(function(res){
console.log('2.1')
root.user = res.data;
})
.error(function(res){
console.log('2.2')
});
}