Promise控制同时请求的数量

控制同时进行的请求数量代码实现

js 复制代码
async function runWithConcurrency(tasks, maxConcurrent) {  
    const results = []; // 存放所有任务的最终结果(Promise)  
    const activeTasks = []; // 当前正在执行的任务对应的Promise(用于跟踪)  

    for (const task of tasks) {  
        // 1. 创建代表当前任务的Promise。`() => task()` 确保任务在需要时才启动  
        const taskPromise = Promise.resolve().then(task);  
        results.push(taskPromise); // 保存结果,最后统一用 Promise.all 等  

        // 2. 创建任务完成后的清理操作:从 activeTasks 中移除自己  
        const removeFromActive = () => activeTasks.splice(activeTasks.indexOf(removeFromActive), 1);  
        activeTasks.push(removeFromActive); // 注意:这里存的是清理函数对应的Promise  

        // 3. 如果当前活跃任务数已达上限,就等任意一个完成  
        if (activeTasks.length >= maxConcurrent) {  
            await Promise.race(activeTasks); // 等 activeTasks 数组里任意一个Promise完成  
        }  

        // 4. 将清理操作与实际任务完成挂钩  
        taskPromise.then(removeFromActive, removeFromActive); // 无论成功失败都清理  
      }  

    // 5. 等待所有任务完成(无论是否在活跃池中)  
    return Promise.allSettled(results); // 或者用 Promise.all(results) 只关心成功  
}  

// 使用示例  
const userIds = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];  
const tasks = userIds.map(id =>() => (id));  

// 最多同时发出 3 个请求  
runWithConcurrency(tasks, 3).then(results => {  
    console.log('所有用户获取完成 (并发控制):', results);  
});
  • 这个函数会确保最多只有maxConcurrent个请求同时在进行。
  • 当一个请求完成,池子里有空位了,才会开始下一个请求。
相关推荐
开开心心就好36 分钟前
批量提取PDF中的图片,直接导出原图
前端·javascript·支持向量机·智能手机·pdf·html·启发式算法
Setsuna_F_Seiei3 小时前
前端转型 Agent 开发 05 之 Agent Hooks 与 Checkpointer(让 Agent 从全自动转变人为可掌控)
前端·agent·ai编程
百万蹄蹄向前冲5 小时前
风扇转了一晚上MVP专家团翻车事故
前端·人工智能
默_笙5 小时前
🏛 给 AI 配一间办公室:Harness Engineering 六大模块与它的实现
前端·javascript
linux_cfan6 小时前
videojs v10 源代码系列解读:14 · 谓词守卫:在运行时安全地调用能力
前端·javascript·音视频
kyriewen6 小时前
我扒了 10,221 条 JD:腾讯技术岗 75% 在要 AI
前端·人工智能·ai编程
郑州光合科技余经理7 小时前
同城外卖小程序开发:下单成功后,后台导出能不能对上用户端状态
开发语言·前端·git·后端·uni-app·php·ai编程
IT_陈寒8 小时前
Vue的响应式让我熬到凌晨三点,原来漏了这个小细节
前端·人工智能·后端
Blanche15008 小时前
利用 RAG 为答疑机器人扩展知识范围
前端
天若有情6738 小时前
【纯前端小工具】公历生日转农历,批量查询每年农历生日对应的公历日期(GitHub Pages在线直接用)
前端·javascript·github pages·农历转换·lunisolar·网页小工具