我真的很挣扎在这里的承诺 现在已经超过一天了,我仍然无法理解。
我是Angular的新手,而且更多的是对承诺“概念”的新手,所以我确信有一些我不知道的东西,但我无法弄明白。
基本上,我使用$post
请求呼叫远程Web服务,并在success
方法中更新$rootScope
上的一些数据
login服务
this.login = function(url, request) {
return $http.post( url, request ).
success(function(data) {
if (data.return_code === 0) {
userData = {
name: data.name,
role: data.role
}
/*
* Inside this function, $rootScope gets
* updated with userData
*/
storage.update('user_details', userData)
}
else {
// non authorized user
}
return userData
}).
error(function(data, status) {
throw new Error()
})
}
然后,在控制器中,我做了类似
的事情$scope.login = function(url, request) {
loginService.login(url, request).then(function(response) {
/* this is a ui.router redirection to the state 'home' */
$state.go('home')
})
}
问题是在新页面(home
状态)中,$ rootScope没有更新,除非我进行页面重新加载,“解决”了这个问题。
在我看来,承诺的调用并不等待页面重定向的完成,但即使在$ timeout中包装$ state.go也无法解决问题。 ..
我真的迷路了,任何帮助都会受到赞赏
答案 0 :(得分:0)
如果存储更新是某些异步操作,您希望等待它完成并返回一个承诺,那么您可以直接链接它:
this.login = function(url, request) {
return $http.post(url, request).then(function(data){
if (data.return_code === 0) {
var userData = {
name: data.name,
role: data.role
};
return storage.update('user_details', userData).then(function(){
return userData;
});
}
else {
}
})
};
用法:
loginService.login(...).then(function(userData){
//You reach here only after storage.update was completed
$state.go('home')
});