JavaScript中的Promise.allSettled与Promise.all有何区别?

JavaScript中的Promise.allSettled与Promise.all有何区别?
最新回答
清旖

2021-09-08 14:19:45

Promise.all与Promise.allSettled的核心区别在于失败处理逻辑和返回结果结构,前者采用“短路”机制,后者执行“全量”收集。具体差异如下:

1. 失败时的行为差异
  • Promise.all

    立即拒绝:只要输入的Promise数组中有任意一个被拒绝(rejected),整个Promise链会立即终止,并返回第一个错误。

    示例:const p1 = Promise.resolve(1);const p2 = Promise.reject("出错");const p3 = Promise.resolve(3);Promise.all([p1, p2, p3]) .then(console.log) // 不会执行 .catch(console.error); // 输出: "出错"

  • Promise.allSettled

    等待全部完成:无论输入的Promise是成功(fulfilled)还是失败(rejected),均会等待所有Promise执行完毕,再返回结果。

    示例:Promise.allSettled([p1, p2, p3]) .then(console.log);// 输出:// [// { status: "fulfilled", value: 1 },// { status: "rejected", reason: "出错" },// { status: "fulfilled", value: 3 }// ]

2. 使用场景差异
  • Promise.all

    适用场景:需要所有任务均成功才能继续的场景,例如:

    并发请求数据:多个API请求必须全部成功,否则整体视为失败。

    资源加载:图片、脚本等资源需全部加载完成才能渲染页面。

    优势:快速失败(fail-fast),避免无效等待。

  • Promise.allSettled

    适用场景:需收集所有任务的最终结果(包括失败)的场景,例如:

    批量提交操作:统计成功与失败的数量,记录错误日志。

    数据校验:对多个数据项进行异步校验,汇总所有结果。

    优势:提供完整的结果集,便于后续分析或重试。

3. 返回结果结构差异
  • Promise.all

    成功时:返回一个数组,元素顺序与输入Promise一致,每个元素为对应Promise的成功值。

    失败时:直接返回第一个错误,忽略其他Promise的结果。

    示例:Promise.all([Promise.resolve(1), Promise.resolve(2)]) .then(data => console.log(data)); // 输出: [1, 2]

  • Promise.allSettled

    始终返回对象数组:每个对象包含以下字段:

    status:状态("fulfilled"或"rejected")。

    value(成功时)或reason(失败时):对应结果或错误原因。

    示例:Promise.allSettled([Promise.resolve(1), Promise.reject(2)]) .then(data => console.log(data));// 输出:// [// { status: "fulfilled", value: 1 },// { status: "rejected", reason: 2 }// ]

4. 关键逻辑总结
  • Promise.all“短路”逻辑,任一失败即终止,适合严格依赖所有任务成功的场景。
  • Promise.allSettled“全量”收集,容忍部分失败,适合需要完整结果分析的场景。
选择建议
  • 若需快速失败且无需处理部分结果,使用Promise.all。
  • 若需统计成功/失败数量或记录错误日志,使用Promise.allSettled。
  • 两者均支持并发执行,但Promise.allSettled不会因单个失败而丢失其他结果。