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 }// ]
Promise.all
适用场景:需要所有任务均成功才能继续的场景,例如:
并发请求数据:多个API请求必须全部成功,否则整体视为失败。
资源加载:图片、脚本等资源需全部加载完成才能渲染页面。
优势:快速失败(fail-fast),避免无效等待。
Promise.allSettled
适用场景:需收集所有任务的最终结果(包括失败)的场景,例如:
批量提交操作:统计成功与失败的数量,记录错误日志。
数据校验:对多个数据项进行异步校验,汇总所有结果。
优势:提供完整的结果集,便于后续分析或重试。
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 }// ]