大量异步并发请求控制并发解决方案

实现思路:

可以使用 Promise 和异步函数。手动实现一个同步队列

测试数据

js 复制代码
const tasks = new Array(88).fill(0).map((_, i) => () => {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve(i)
    }, Math.random() * 1000)
  })
})

核心代码

js 复制代码
function limitRequest(tasks, limit) {
  const queue = []
  let runingCount = 0
  function enqueque(task) {
    return new Promise((resolve, reject) => {
      queue.push({
        task,
        resolve,
        reject,
      })
      run()
    })
  }

  function run() {
    while (queue.length > 0 && runingCount < limit) {
      runingCount++
      const { task, resolve, reject } = queue.shift()
      task()
        .then((value) => {resolve(value);console.log(value)})
        .catch((err) => reject(err))
        .finally(() => {
          runingCount--
          run()
        })
    }
  }

  return Promise.all(tasks.map((task) => enqueque(task)))
}

测试代码

js 复制代码
console.log(await limitRequest(tasks, 10))
相关推荐
余人于RenYu4 小时前
Claude + Figma MCP
前端·ui·ai·figma
杨艺韬7 小时前
vite内核解析-第2章 架构总览
前端·vite
我是伪码农7 小时前
外卖餐具智能推荐
linux·服务器·前端
2401_885885048 小时前
营销推广短信接口集成:结合营销策略实现的API接口动态变量填充方案
前端·python
小李子呢02118 小时前
前端八股性能优化(2)---回流(重排)和重绘
前端·javascript
程序员buddha8 小时前
深入理解ES6 Promise
前端·ecmascript·es6
吴声子夜歌8 小时前
ES6——Module详解
前端·ecmascript·es6
剪刀石头布啊9 小时前
原生form发起表单干了啥
前端
剪刀石头布啊9 小时前
表单校验场景,如何实现页面滚动到报错位置
前端
gyx_这个杀手不太冷静9 小时前
大人工智能时代下前端界面全新开发模式的思考(二)
前端·架构·ai编程