当Promise.all中存在Promise被拒绝时,如何统计已成功的Promise数量
实现方案说明
结论
该需求完全可以实现,仅需在原有逻辑基础上对异步任务做轻量包装即可。
实现思路
原生Promise.all本身支持短路报错(任意任务失败立即终止执行并抛出错误),恰好符合你的需求,只需要额外维护一个计数器记录成功完成的任务数量即可:
- 在任务队列外声明一个计数变量
- 对每个异步任务做一层包装,任务成功resolve时给计数变量加1
- catch块中直接读取该计数变量即可得到报错时已成功的任务数
代码示例
// 你的原有异步处理函数 async function processTask(x) { // 此处为你的原有业务逻辑 await new Promise(resolve => setTimeout(resolve, Math.random() * 1000)); // 模拟随机报错场景 if (Math.random() < 0.3) throw new Error(`task ${x} execute failed`); return x; } async function executeBatchTasks() { let successNum = 0; // 包装所有异步任务,成功时计数+1 const taskList = [1,2,3,4,5].map(item => { return processTask(item).then(res => { successNum++; return res; }) }); try { await Promise.all(taskList); // 全部任务成功的处理逻辑 return statistics(successNum); } catch (err) { // 报错时直接读取当前已成功的数量 return statistics(successNum); } }
原理解释
- 每个被包装的任务只有成功resolve后才会进入
then回调执行计数加1的逻辑,计数完全准确 Promise.all的短路特性会在第一个任务失败时立即触发catch,不会等待其余未完成的任务,符合你要求的「出现任意错误立即终止执行」的需求
内容的提问来源于stack exchange,提问作者zoobiedoobie
相关产品推荐
相关产品推荐

