有没有办法/模式来实现let res = Promise.all([...p], limit)
?
- promise 数组包含构造和返回 promise 的函数
res
应该在所有p
解析之后被解析- 只有
limit=3
Promise 应该并行 - 第 n+1 个 Promise 应该在 n 完成后立即开始。这样总有
limit
解析器并行运行。
尤其是最后一点让我很头疼。
我当前的解决方案是将 promises-array 拆分为 limit
大小的 block 并将它们链接起来。此处的缺点是,在第 1 组的所有 Promise 都已解决之前,第二组不会开始。
最佳答案
我想到了创建 n = limit
链的想法,只要有 promise ,它就会并行运行并追加:
let promises = [];
for(let i=0; i<11; i++) promises[i] = () => {
console.log('Construct:',i);
return new Promise(resolve => {
setTimeout(function() {
console.log('Resolve:',i);
resolve(i);
}, Math.round(Math.random() * (2000 - 500) + 2000));
});
}
function parallelLimit(promiseFactories, limit) {
let result = [];
let cnt = 0;
function chain(promiseFactories) {
if(!promiseFactories.length) return;
let i = cnt++; // preserve order in result
return promiseFactories.shift()().then((res) => {
result[i] = res; // save result
return chain(promiseFactories); // append next promise
});
}
let arrChains = [];
while(limit-- > 0 && promiseFactories.length > 0) {
// create `limit` chains which run in parallel
arrChains.push(chain(promiseFactories));
}
// return when all arrChains are finished
return Promise.all(arrChains).then(() => result);
}
parallelLimit(promises, 4).then(console.log);
很高兴阅读您的评论和建议:)
关于javascript - Promise.all() 有限制吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40375551/