![](/img/trans.png)
[英]Execute at most N tasks in parallel using JS promises or generators
[英]generators + promises to parallelize N number of items
挑战:
例如:
即使2,3,5在1之前返回,我们也应保留2,3,5的结果,并在返回1时依次处理1,2,3(并等待4在5之前返回)
工具:Q + ES6生成器
使用占位符变量创建N-1个长度的数组
N = 3时的EG
let [N1,N2,N3] = yield [ Promise1, Promise2, Promise3 ]
//process items sequentially:
console.log(N1)
console.log(N2)
console.log(N3)
但是,填充空变量数组似乎似乎不起作用,因为引用不知道在哪里可以找到var声明。
for(var i = 0; i< 3; i++) {
res.push("some empty var")
}
考虑到使用所提供工具的限制,我们如何并行化调用,但按顺序处理它们的返回?
您可以使用Promise.all()
.then()
答案中的javascript
返回问题中所述的确切结果
- 我们要为项目的子项提出N个并行的ajax请求。
- 返回后,我们要按顺序处理它们(1 ... N)
- 我们不想等待所有的承诺都返回,但是我们希望在它们返回时按顺序进行处理。 我们如何并行化调用,但顺序地处理它们的返回?
您可以使用.then()
链接到它返回一个承诺或原有功能Promise
对象本身处理之前的承诺return
以传递给参数顺序进行处理荷兰国际集团价值Promise.all()
的.then()
拴Promise.all()
var n = 0; var fn = function() { return new Promise(function(resolve, reject) { console.log("promise " + ++n + " called"); setTimeout(function(i) { resolve(i) }, Math.random() * 2500, n) }) // handle requirement 3. here .then(function(res) { console.log(res); return res }) } Promise.all([fn(), fn(), fn()]) // handle requirement 1. here // handle requirement 2. here .then(function(data) { let [N1, N2, N3] = data; console.log(N1, N2, N3); })
您可以通过等待循环中的下一个承诺来做到这一点:
const promises = […]; // or created programmatically
for (const promise of promises) {
const result = yield promise; // await them sequentially
console.log(result);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.