Promise.allSettled 和 Promise.all 是 JavaScript 中用于处理多个 Promise 的两个方法,但它们的行为有显著区别,适用于不同场景。以下是它们的核心差异:
1. 失败处理Promise.all
特点 :只要有一个 Promise 被拒绝(rejected),整个 Promise 会立即失败。
适用场景 :需要所有任务都成功完成的情况(例如并发请求多个 API,任一失败则终止流程)。示例 :
const p1 = Promise.resolve(3); const p2 = new Promise((resolve, reject) => setTimeout(reject, 100, '出错了')); const p3 = Promise.resolve('foo'); Promise.all([p1, p2, p3]) .then(values => console.log(values)) // 不会执行 .catch(error => console.error(error)); // 立即输出 "出错了"
Promise.allSettled
特点 :无论所有 Promise 是否成功,都会等待它们全部完成(fulfilled 或 rejected),最终返回每个 Promise 的状态和结果。
适用场景 :需要知道所有任务的结果(无论成功或失败),例如批量处理、并行计算后统计结果。Promise.allSettled([p1, p2, p3]) .then(results => { results.forEach((result, index) => { if (result.status === 'fulfilled') { console.log(`任务 ${index} 成功: ${result.value}`); } else { console.log(`任务 ${index} 失败: ${result.reason}`); } }); }); // 输出: // 任务 0 成功: 3 // 任务 1 失败: 出错了 // 任务 2 成功: foo
2. 返回结果结构
Promise.all
返回值:一个数组,包含所有 Promise 的 成功值 (按输入顺序排列)。
如果任意一个 Promise 被拒绝,则直接进入 .catch()。
Promise.allSettled
返回值:一个对象数组,每个对象包含以下属性:
status: 'fulfilled' 或 'rejected'
value: 成功时的值(仅当 status 为 fulfilled 时存在)
reason: 失败时的错误(仅当 status 为 rejected 时存在)
3. 使用场景对比
需要所有任务都成功
Promise.all
任一失败则终止流程
需要统计所有任务结果(无论成功/失败)
Promise.allSettled
所有任务完成后返回完整结果
仅需第一个成功/失败的结果
Promise.race
与本文无关,但常被提及
总结
选择 Promise.all :当所有任务必须成功完成,否则整个流程失败(例如并发请求多个依赖项)。
选择 Promise.allSettled :需要完整了解所有任务的最终状态(例如批量操作后的结果分析)。网友回复
js如何流式输出ai的回答并折叠代码块,点击代码块右侧可预览代码?
ai大模型如何将文章转换成可视化一目了然的图片流程图图表?
大模型生成html版本的ui原型图和ppt演示文档的系统提示词怎么写?
rtsp视频直播流如何转换成websocket流在h5页面上观看?
为啥coze会开源工作流agent coze studio?
如何检测网页是通过收藏夹打开的?
python如何实现类似php的http动态脚本请求处理响应代码?
js如何实现类似php的http动态脚本请求处理响应代码?
trae与solo有啥区别不同?
vue如何让ai动态生成问卷调查多步骤表单式收集基础信息自动规划执行任务?