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如何在浏览器中将webm视频的声音分离为单独音频?
微信小程序如何播放第三方域名url的mp4视频?
ai多模态大模型能实时识别视频中的手语为文字吗?
如何远程调试别人的chrome浏览器获取调试信息?
为啥js打开新网页window.open设置窗口宽高无效?
浏览器中js的navigator.mediaDevices.getDisplayMedia屏幕录像无法录制SpeechSynthesisUtterance产生的说话声音?
js中mediaRecorder如何录制window.speechSynthesis声音音频并下载?
python如何直接获取抖音短视频的音频文件url?
js在浏览器中如何使用MediaStream与MediaRecorder实现声音音频多轨道混流?