生成一个依赖于递归承诺的承诺
Produce a promise which depends on recursive promises
我有一个整数id数组,例如
var a=[1,2,3,4,5]
和我需要对每个id执行异步远程调用。每个调用都是一个WebAPI请求,使用$resource执行,并作为promise呈现。
我需要创建一个函数,它接受这些id的数组,然后初始化递归承诺链。这个链应该导致相应的webapi调用每个id,一个接一个。这些调用不应该是并行的,而应该是链式的。
所讨论的函数返回自己一个"main"承诺,应该根据异步web调用的结果来解决或拒绝。也就是说,如果递归中的某些承诺由于与服务器断开连接而被拒绝,则主承诺也应该失败。在正常情况下,"main" promise必须在所有请求完成时解决。
如何在angularjs中实现?
在数组上使用reduce
将承诺链接在一起。没有必要让它递归。
// for angularjs: var Q = $q.when;
var p = a.reduce(function(prev, el) {
return prev.then(function(arr) {
return makeRequest(el).then(function(res) {
return arr.concat([res]);
});
});
}, Q([]));
这其实是一个非常合理的请求。
在没有特定.each
控件的库中,我们使用的工具是.then
:
var a = [1,2,3,4,5];
var p = makeRequest(a.shift()); // use first element
a.forEach(function(el){
p = p.then(function(result){
return makeRequest(el);
});
});
p.then(function(){
// all requests done
});
请注意,我假设您在这里有一个makeRequest
方法,该方法发出单个请求并返回一个承诺,当该请求完成时实现。
如果需要,也可以使用辅助数组返回请求的结果:
var a = [1,2,3,4,5];
var results = Array(a.length);
var p = makeRequest(a.shift()).
then(function(res){ results[0] = res;}); // use first element
a.forEach(function(el,i){
p = p.then(function(result){
results[i] = result;
return makeRequest(el);
});
});
p = p.thenResolve(results); // resolve with results, in BB that'd be p.return(results)
p.then(function(results){
// all requests done
console.log(results); // array of response values
}).catch(function(e){
// single failure
});
使用Bluebird库的v2分支,您可以这样做:
Promise.each([1,2,3,4,5],makeRequest).then(function(results){
// access results
});
相关文章:
- 依赖于缓慢加载javascript的UI
- 如何隐藏&使用jQuery禁用依赖于另一个字段值的字段
- Node.js中依赖于版本的类型继承
- 如何使AngularJS控制器依赖于通过ajax加载在rootScope上的值
- 如何使用EnquireJS使AngularJS范围变量依赖于媒体查询
- Ajax xml源解析依赖于jQuery的点击操作
- Sails.js日志传输依赖于环境
- 如何使用 2 个 XMLHttpRequest 一个依赖于另一个
- 如何展平嵌套承诺依赖项
- Javascript表单.使一个条目依赖于另一个条目
- 在<p>标签依赖于<选择>标签,javascript
- Angularjs-uib日期选择器中的customClass依赖于promise
- 试图使一个事件依赖于另一个事件,并使用jquery自定义事件传递数据
- 使用jquery如何自动删除下拉列表中的第一个空白选项(如果它依赖于另一个选项)
- yii2:依赖于Action的条件显示/显示字段
- 测试依赖于另一个指令Angularjs的指令
- 创建一个不依赖于Snap实例的组
- 屏幕依赖于菜单切换,并在javascript中自动打开
- 在前端承诺中链接依赖于彼此的服务器调用是不好的做法吗?
- 生成一个依赖于递归承诺的承诺