我有两个承诺:
getToken()//:从服务器获取CSFR cookie
和
getUseraData()//:获取用户数据,但需要从getToknen()获取cookie,否则服务器会响应错误。
所以,我知道我可以在我的控制器中执行此操作:
getToken().then(function (result) {
getUserData(result);
});
但我知道在承诺中履行承诺并不是那么好。
那么:只有在getUserData()
终止并返回值后才能执行getToken
承诺?
答案 0 :(得分:2)
将承诺链接起来没有任何问题,只要您不忘记返回承诺,这就是您正在做的事情,所以这样做:
var getUserDataPromise = getToken().then(function (result) {
return getUserData(result);
});
或者像这样:
getToken().then(function (result) {
return getUserData(result);
}).then(function(getUserDataPromiseResult){
//here you will have the getUserData promise resolved
});
请注意,为此,您需要return
承诺。我坚持认为:这不是一个坏习惯,这是 very common practice
答案 1 :(得分:0)
你可以使用延迟函数..你需要注入$ q ..
创建一个服务然后添加你的getToken http请求代码..像这样
myapp.factory('myService',$q,$http){
var deferred = $q.defer();
var newVal = { 'Value': val };
var getToken = functino(){ $http({
method: 'PATCH',
url: baseService.getBaseService + 'ModuleAndParameters(' + ModAndParamsId + ')',
data: newVal
}).success(function (data, status, headers, config) {
deferred.resolve(data)
}).error(function (data, status, headers, config) {
deferred.reject(status);
});
return deferred.promise;
};
return getToken;
}
然后在你的控制器中,注入你的服务名称..只是简单地这样做..
myService.getToken().then(function(result){
getUserData(result);
})
我希望它能帮助...... xD