AngularJs:返回已经找到的嵌套$http解决方案的承诺,但为什么它能工作
AngularJs: return a promise of nested $http - solution already found but why does it work?
我想构建一个嵌套的$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
相关文章:
- 可以转换显示属性吗?如果没有,什么'这是最好的解决方案
- iPad虚拟键盘-哪一个-javasctript解决方案
- AJAX HTTP基本身份验证解决方案
- 在chrome web商店中打开时,是否有允许执行内容/后台脚本的解决方案
- RxJS等待承诺解决
- Chart.js-添加渐变而不是纯色-实现解决方案
- learnyounode杂耍异步解决方案不工作
- 了解因子分解解决方案
- 提交表单后的最佳解决方案
- 计时器在使用 jQuery 一分钟后没有触发,或者每 1 分钟后给出一些其他解决方案来触发功能
- chrome中的意外全局变量有解决方案吗
- 更好的解决方案HTML元素幻灯片从右侧CSS转换
- 使用SeleniumWebdriver将文本复制到文件时出现编译错误的解决方案
- 如何让我的网站上的WEBP图像加载在morzilla firefox中有一个可能的解决方案吗?如果是,那么如何
- JS驱动的常见问题页面的推荐DB解决方案
- 这里有一个更优雅的/DRY/可维护的JS解决方案
- 节点和异步/等待,承诺...哪种解决方案最好
- Ember RSVP承诺解决firefox插件端口消息传递方案无法解决的模型
- AngularJs:返回已经找到的嵌套$http解决方案的承诺,但为什么它能工作
- 除了绑定之外,任何其他上下文解析的解决方案都在承诺中