我想构建一个嵌套的$http.get,在第一个成功后,然后请求第二个。
然后我想出了这样的东西:
$http.get('/xxx').then(function(response){
$http.get('/yyy').then(function(response){
//do something
})
});
但我想返回一个Promise,这样我就可以正确地组织我的代码。显然,上面的代码不符合我的需要。
然后我用$q.all()
做了很多研究,但实际上用$q.all,第二个请求不会等待第一个,即使第一个请求没有成功响应,它也会发送第二个。。
之后,我找到了一个解决方案,在我的情况下,它就像一个魅力:
var promise = $http.get('/xxx').then(function(response1){
return $http.get('/yyy').then(function(response2) {
return response2.data;
});;
});
return promise;
但我不明白为什么它会起作用???
在第一个promise($http.get(的成功函数中,它返回第二个promise作为then((函数的参数。
但如果我打电话给
promise.then(function(data){
console.log(data);
});
我发现这里打印的数据是响应2.data,怎么可能呢?它不应该是第二个$http的Promise对象吗???
当您从promise .then(…)
回调返回promise时,promise库将自动等待内部promise的解析,然后用该值解析返回的promise。
换句话说,如果你许下一个承诺,你就会找回它的内在价值。
这是承诺之美的一部分;你可以利用这个功能并链接你的承诺来减少嵌套:
var promise = $http.get('/xxx').then(function(response1) {
return $http.get('/yyy');
}).then(function(response2) {
return response2.data;
});
有关更多详细信息,请参阅我的博客。
第一次尝试不起作用,因为您没有返回内部http调用返回的promise。相反,它是从最初的承诺中返回一个派生的承诺。派生的promise使用未定义的值进行解析。
此处提供更多信息:http://www.syntaxsuccess.com/viewarticle/angular-promise-chaining-explained