javascript - Promise.all() 有限制吗?

标签 javascript es6-promise

有没有办法/模式来实现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/

相关文章:

javascript - 使用生成器暂停直到 promise 解决

javascript - Material Design Lite 与 AngularJS 的集成

javascript - 如何在Javascript中获取两个时间之间的时差?

javascript - CSS 动画在 onclick 事件后不触发

javascript - 在 Javascript 中等待函数时捕获错误的正确方法

javascript - 在 js 中返回 promise 的链接函数

javascript - 如何定义三个圆的交点?

javascript - 控制台日志显示问题

javascript - 使用 Promise 通过外部函数从 DOM 检索属性

javascript - Promise/A+ with chain then() 回调用例?