在前端开发中,异步编程是非常常见的。以往我们可能需要使用 Promise.all 来解决多个异步请求的情况,但是 Promise.all 只有在所有 Promise 都 resolve 时才会返回一个 resolve。因此,如果其中一个 Promise 被 reject 了,那么整个 Promise.all 的执行也会被打断。而在 ECMAScript 2021 (ES12) 中,引入了 Promise.allSettled,它的表现与 Promise.all 不同,可以让我们更加优雅地处理异步请求。
Promise.allSettled 的介绍
Promise.allSettled 是 Promise.all 的一个变体,它不同于 Promise.all,因为它只有在所有 Promise 都有了结果时才会返回一个 resolve。和 Promise.all 不同,Promise.allSettled 不会在其中一个 Promise 被 reject 时中断执行,相反,它会一直等待直到所有 Promise 都 settled(resolved 或 rejected)之后才会返回结果。
Promise.allSettled 的返回值是一个由每个 Promise 的状态组成的数组。每个元素都是一个对象,对象的属性值分别是每个 Promise 对应的值或原因,如下所示:
[ { status: "fulfilled", value: "aaa" }, { status: "rejected", reason: new Error("failed") }, { status: "fulfilled", value: "bbb" } ]
使用示例
下面是一个例子,它使用了 Promise.allSettled 来处理多个异步请求,无论请求成功或者失败,最后都能够正确返回结果。
-- -------------------- ---- ------- ----- -------- - - --- ----------------- ------- -- - ------------- -- - -------------- -- ----- --- --- ----------------- ------- -- - ------------- -- - ---------- ---------------- -- ----- --- --- ----------------- ------- -- - ------------- -- - -------------- -- ----- -- - ----------------------------------------- -- - -------------------- --
以上代码会输出:
[ {status: "fulfilled", value: "aaa"}, {status: "rejected", reason: Error: failed at promise.allSettled.js:12}, {status: "fulfilled", value: "bbb"} ]
总结
Promise.allSettled 是 ES12 中的新特性,相较于 Promise.all 更加优雅地解决了异步请求中的问题,它会一直等待直到所有 Promise settled 后才会返回结果。这对于复杂的异步代码来说,是非常有帮助的。使用 Promise.allSettled,我们可以更加灵活地处理异步代码,处理和管理代码变得更加简单。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6522cb3a95b1f8cacda44299