Promise.all 限制并发

Posted 左手121

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Promise.all 限制并发相关的知识,希望对你有一定的参考价值。

实现

function PromiseLimit(funcs, limit = 5) 
  const list = [...funcs]
  const result = []
  const executing = []

  function queue() 
    const func = list.shift()
    if (!func) return Promise.all(executing)
    const promise = func()
    result.push(promise)
    const e = promise.then(() => 
      executing.splice(executing.indexOf(e), 1)
    )
    executing.push(e)
    if (executing.length >= limit) 
      return Promise.race(executing).then(() => queue())
    
    return Promise.resolve().then(() => queue())
  

  return queue().then(() => Promise.all(result))

测试

const result = []
for (let index = 0; index < 10; index++) 
  result.push(function () 
    return new Promise((resolve, reject) => 
      console.log(`开始$index`, new Date().toLocaleString())
      setTimeout(() => 
        if (Math.random() > 0.5) 
          resolve(index)
         else 
          reject(index)
        
        console.log(`结束$index`, new Date().toLocaleString())
      , parseInt(Math.random() * 1000))
    )
  )

PromiseLimit(result).then(
  data => 
    console.log('成功', data)
  ,
  data => 
    console.log('失败', data)
  ,
)

以上是关于Promise.all 限制并发的主要内容,如果未能解决你的问题,请参考以下文章

Promise.all并发限制

Promise.all并发限制

Promise.all 限制并发

Promise.all 限制并发

Promise.all 限制并发

使用 ES6 的 Promise.all() 时限制并发的最佳方法是啥?