2026年5月30日 02:24
Promise 并发控制如何实现?
Promise 并发控制就是限制同一时间运行的异步任务数量。面试可以先说结论:维护一个任务池,启动任务后放入 executing,数量达到上限就 await Promise.race(executing),等任意任务结束再继续放新任务。最后用 Promise.all 收集全部结果。真实项目里常用于批量请求、上传、爬取、发邮件,目的是保护浏览器连接数、服务端限流和内存。
追问
并发控制和 Promise.all 有什么区别?
Promise.all 会一次性启动所有任务;并发控制只同时跑固定数量。前者适合少量独立任务,后者适合几百、几千个任务。
为什么用 Promise.race?
它能等“最先完成的一个任务”。有任务完成后,池子空出位置,就可以继续补下一个任务。
失败任务怎么处理?
看业务。要快速失败就让错误抛出;要尽量完成全部任务,就给每个任务包一层 catch,返回 {status, value, reason}。
并发数怎么定?
没有固定答案。浏览器请求可从 4-8 开始;Node 服务要看下游 QPS、CPU、连接池和超时率,再动态调。
写段代码
jsasync function pool(limit, list, worker) { const ret = []; const running = []; for (const item of list) { const p = Promise.resolve().then(() => worker(item)); ret.push(p); const e = p.finally(() => running.splice(running.indexOf(e), 1)); running.push(e); if (running.length >= limit) await Promise.race(running); } return Promise.all(ret); }