并发受限的异步任务队列。同时最多跑 simultaneous 个,其余排队,每完成一个就补位。用于批量上传、批量请求这类「不能一次全发出去」的场景。
| 参数 |
说明 |
类型 |
默认值 |
simultaneous |
最大并发数;<= 0 视为 1 |
number |
1 |
| 成员 |
说明 |
add(task) |
入队并返回它自己的结果 promise,有空位时立即开跑 |
allSettled(tasks) |
批量入队,语义同 Promise.allSettled,顺序与入参一致 |
onIdle() |
等队列排空 |
clear() |
丢弃所有尚未开始的任务(在执行的不受影响) |
running / pending / executed / idle |
实时计数 |
import { QuestQueue } from 'ranuts';
const queue = new QuestQueue({ simultaneous: 3 });
const results = await Promise.all(urls.map((url) => queue.add(() => fetch(url))));
// 或者发完不管,最后等全部结束(含失败)
urls.forEach((url) => queue.add(() => fetch(url)).catch(report));
await queue.onIdle();
- 先进先出:按入队顺序执行。
- 单个失败不会拖垮队列。每个任务只 reject 它自己的 promise,下一个照常开始。
- 同步抛错的任务也会被接住,不会漏出
add() 之外、让并发计数卡死。
allSettled 保持入参顺序,逐个上报成功/失败。