从 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 就力不从心了。

阅读更多