2636. Promise 对象池
2025年6月25日小于 1 分钟
2636. Promise 对象池
type F = () => Promise<any>
async function promisePool(functions: F[], n: number): Promise<any[]> {
// 利用数组自身的迭代器,减少变量的维护
const iterator = functions[Symbol.iterator]()
// 任务执行器,存在空闲,主动任务队列拿取新任务执行
async function worker() {
while (true) {
const { value: fn, done } = iterator.next()
if (done) break
await fn()
}
}
// 创建 n 个 worker,每个 worker 会连续取任务执行
const workers = Array.from({ length: n }, () => worker())
// 等待所有 worker 完成
return Promise.allSettled(workers)
}
/**
* const sleep = (t) => new Promise(res => setTimeout(res, t));
* promisePool([() => sleep(500), () => sleep(400)], 1)
* .then(console.log) // After 900ms
*/
Promise.all vs Promise.allSettled
特性 | Promise.all | Promise.allSettled |
---|---|---|
✅ 全部成功时 | 返回每个 Promise 的结果数组 | 返回每个结果对象,含状态和值或错误 |
❌ 任意一个失败时 | 立即 reject,整个结束 | 继续执行所有任务,返回每个任务状态与结果 |
📤 结果结构 | [value1, value2, ...] | [{status, value/reason}, ...] |
⚠️ 用途 | 所有都要成功的场景(如加载多个资源) | 想知道每个任务结果,不管成功还是失败 |