Promise.all()有限制吗?

Psi*_*Psi 7 javascript es6-promise

有没有实现的方式/模式let res = Promise.all([...p], limit)

  • promise-array包含构造和返回promise的函数
  • res应该在所有p结算后解决
  • 只有limit=3Promise应该并行运行
  • n + 1承诺应在n完成后立即开始.因此总是有limit并行运行的解析器.

特别是最后一点让我头疼.

我目前的解决方案是将promises-array拆分为limit大小的块并将它们链接起来.这里的缺点是第二组在第1组的所有Promise都已解决后才开始.

Psi*_*Psi 8

n = limit我想出了创建并行运行并附加只要有承诺的链的想法:

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);
Run Code Online (Sandbox Code Playgroud)

很高兴阅读您的评论和建议:)