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 :需要完整了解所有任务的最终状态(例如批量操作后的结果分析)。网友回复
DLNA与UPnP的区别和不同?
苏超自建抢票app,通过先预约再抽签化解高并发抢票?
python如何让给电脑在局域网中伪装成电视接收手机的投屏图片视频播放?
如何结合python+js如何自己的视频编码与加密播放直播?
python如何在电脑上通过局域网将本地视频或m3u8视频投屏电视播放?
腾讯视频爱奇艺优酷vip电影电视剧视频如何通过python绕过vip收费直接观看?
有没有可免费观看全球电视台直播m3u8地址url的合集?
有没有实现观影自由的免vip影视苹果 CMS V10 API的可用url?
python如何实时检测电脑usb插入检测报警?
如何判断真人操作的鼠标移动直线轨迹与机器操作的轨迹?