从 Promise.race 到并发任务调度器:实现可控的文件上传
在实现文件上传功能时,很多时候会使用 Promise.race 来控制并发:
const pool = new Set();
for (const file of files) {
const task = upload(file);
pool.add(task);
task.finally(() => pool.delete(task));
if (pool.size >= limit) {
await Promise.race(pool);
}
}
这段代码确实能限制同时上传几个任务,但它本质上只是一个”信号灯”——它只知道”有一个任务完成了”,却不知道是哪 一个,也不知道当前队列的真实状态。
当我们需要实现暂停、恢复、取消、状态追踪等功能时,Promise.race 就力不从心了。