前言
Promise 在 JavaScript 前端开发中广泛使用,它是一种异步编程解决方案,能够解决异步操作的问题。在 ES11(即 ECMAScript 2020)中,新增了 Promise.allSettled API,本文将深入探讨其与 Promise.all 的区别以及在实际开发中的应用。
Promise.allSettled 简介
Promise.allSettled 方法接受一个 Promise 数组作为参数,返回一个新的 Promise 数组,该数组的处理程序在所有 Promise 解决或被拒绝后执行。返回的 Promise 数组的每个元素都是一个对象,该对象表示对应的输入 Promise 是否已成功解决或被拒绝,并且包含 Promise resolve 或 reject 的结果。所有 Promise 的处理程序都完成后,Promise.allSettled 的处理程序会执行。
该方法具有以下特点:
- 接受多个 Promise 实例作为参数,以数组的方式传递。
- 无论 Promise 实例的状态是 resolved 还是 rejected,都会返回 Promise 实例的数组,即使其中某个 Promise 实例被 reject。
- 返回的 Promise 实例的数组中每个元素都是一个对象,该对象表明一个 Promise 实例的状态和结果,它的属性有 status,表示 Promise 实例的状态,有两种取值:"fulfilled" or "rejected",reason 表示 Promise 实例返回的数据或者 reject 的原因。
示例代码如下:
-- -------------------- ---- ------- ----- -------- - ------------------- ----- -------- - --- ----------------- ------- -- ------------------ ---- -------------- ----- -------- - --- ----------------- ------- -- ------------------- ---- -------------- ----------------------------- --------- ---------- ------------- -- ---------------------- -- ------- -- - -- - ------- ------------ ------ - -- -- - ------- ----------- ------- ----------- -- -- - ------- ------------ ------ ----------- - -- -
Promise.all 简介
Promise.all 方法接受一个 Promise 数组作为参数,返回一个新的 Promise 对象,只有所有 Promise 都被 resolved 时,返回的 Promise 才会被 resolved,并且每个 Promise 的返回值按照传入的 Promise 数组的顺序返回。如果其中任意一个 Promise 被 reject,则返回的 Promise 会直接 reject 并抛出错误。
该方法具有以下特点:
- 接受多个 Promise 实例作为参数,以数组的方式传递。
- 只有当数组中所有 Promise 实例的状态都为 resolved,结果才会按照数组的传入顺序返回成功的结果。
- 只有一个 Promsie 实例的状态改变,该方法的返回 Promise 实例的状态就会发生改变,Promise.all 返回的 Promise 实例的状态会由第一个被 rejected 的 Promise 实例决定。
示例代码如下:
const promise1 = new Promise((resolve, reject) => setTimeout(resolve, 100, 'resolved!')); const promise2 = Promise.resolve(3); Promise.all([promise1, promise2]) .then(results => console.log(results)); // Output: ["resolved!", 3]
Promise.allSettled 与 Promise.all 的区别
通过上述的介绍与示例代码,我们可以得出以下结论:
- Promise.allSettled 返回一个数组,其所有 Promise 都会执行,并且会根据个 Promise 的状态,返回一个对象包含 Promise 的状态和结果。而 Promise.all 只有在所有 Promise 都被 resolved 时才会执行,并且将所有 Promise 的返回值按照传入 Promise 数组的顺序组成一个新数组返回。
- Promise.allSettled 不会在所有 Promise 实例都 resolve 后才执行,而 promise.all 则需要在所有 Promise 实例都为 resolve 状态时才会有返回的结果。
换句话说,Promise.allSettled 偏重于我们关注每个 Promise 实例的状态和结果,而 Promise.all 偏重于“所有 Promise 实例都应该完成”。因此,我们应该根据需求,合理选择使用以上两种方法。
总结
Promise.allSettled 与 Promise.all 在某些场景下具有相似之处,但仍然存在较大的差异。在实际开发中,要根据具体的需求和业务场景去选择使用。掌握这两种方法的使用方式和规则,对提高前端编程能力和编写高质量代码有很大的帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6518e53395b1f8cacd128549