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

实现思路:

可以使用 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))
相关推荐
IT_陈寒31 分钟前
SpringBoot实战技巧总结
前端·人工智能·后端
TeamDev35 分钟前
使用 JxBrowser 在桌面应用中集成 Spring
java·前端·后端·spring·混合应用·jxbrowser·浏览器控件
陈随易2 小时前
Rolldown 把插件改动回传提速 26 倍
前端·后端·程序员
笃行3509 小时前
集中式与分布式,KingbaseES 的四种形态共用一套内核
前端
陈随易11 小时前
Vue 编译器换掉 source map,快了三四成
前端·后端·程序员
ZhengEnCi12 小时前
12 种高级 UI 交互效果及对应 AI 提示词:从按压回弹到底部抽屉的物理感教学
前端·css·交互设计
IT_陈寒15 小时前
Redis大key删除为什么会导致服务卡顿?我的线上事故复盘
前端·人工智能·后端
用户27050777252415 小时前
MCP 最小 Server 实测:3 个 JSON-RPC 报错与修法
前端
用户4993350250715 小时前
一人VIP账号多人共用:Web 代理里的会话共享怎么实现
前端
用户老李15 小时前
无线电自学教程 05:第一台收音机——从矿石机到 SDR
前端