Promise.allSettled 是 ES2020 中新增的一个方法,它能够并行地执行多个 Promise,并且无论这些 Promise 是否 fulfilled 或 rejected,都会等待它们被解决后再统一返回结果。本文将详细介绍 Promise.allSettled 的用法、特性和示例。通过学习本文,你将掌握 Promise.allSettled 的使用技巧,为你的前端开发提供便利和效率。
Promise.all 与 Promise.allSettled 的区别
在介绍 Promise.allSettled 之前,我们需要先了解一下 Promise.all。
Promise.all 是目前最为常用的 Promise 方法之一,它可以并行地执行多个 Promise,并返回一个新的 Promise 实例,这个新的 Promise 实例在所有 Promise 对象都 fulfilled 后才会 fulfilled,并返回所有 Promise 对象的结果数组。如果其中任意一个 Promise 被 rejected,则新的 Promise 实例立即被 rejected 并返回这个 Promise 的错误结果。
Promise.all 是所有 Promise 的结果集合,我们只关注 Promise 是否 fulfilled,并且只拿到返回值。但是在实际开发中,我们有时也需要知道每个 Promise 的执行结果,不仅是 fulfilled,还包括 rejected。
这时候 Promise.allSettled 就可以发挥它的作用了。Promise.allSettled 会等待所有 Promise 都 settled(不管是 fulfilled 还是 rejected)后,返回一个数组,每个元素包含一个对象,该对象表示对应的 Promise 的状态和结果。
Promise.allSettled 的用法
Promise.allSettled 的语法与 Promise.all 相同,只是方法名不同。
Promise.allSettled(iterable);
Promise.allSettled 接受一个可迭代对象(例如数组),该对象的每一个成员都是一个 Promise 实例。如果不是 Promise 实例,则会先调用 Promise.resolve 方法将其转换为 Promise 实例。
Promise.allSettled 返回一个新的 Promise 实例,该实例在所有 Promise 都 settled 后进行 resolve,resolve 的值是一个数组,数组的每一项都是一个对象,分别表示原 Promise 实例的状态和结果。对象的属性有:
status
:Promise 的状态,可能为fulfilled
或rejected
value
:Promise fulfilled 的结果,如果状态为 rejected 则不存在该属性reason
:Promise rejected 的结果,如果状态为 fulfilled 则不存在该属性
Promise.allSettled 的示例
下面是一个示例,使用 Promise.allSettled 并行执行多个 Promise,并打印每个 Promise 的状态和结果:
-- -------------------- ---- ------- ----- -------- - - ------------------- ------------------ ---------------- ------------------- -- ---------------------------- ------------- -- - ---------------------- -- - --------------------------- -- --------- - -------- -- -------------- --- ------------ - -------------------------- -- ----- - ---- - --------------------------- -- ----- - --- ---展开代码
上述代码执行结果如下:
fulfilled 1 rejected Error: error fulfilled 2
我们可以看到,Promise.allSettled 并行执行了三个 Promise,分别返回了 1、error 和 2。其中,第二个 Promise 被 rejected,但是它的状态和结果也被正确地返回了。
注意事项
- Promise.allSettled 的兼容性不太好,在一些老版本的浏览器中不支持。但是我们可以使用一个 polyfill 进行兼容。
- Promise.allSettled 返回的数组顺序与输入数组顺序相同,即使某个 Promise 先 resolve,后 resolve 的 Promise 依然在后面。
- 在开发时,Promise.allSettled 不会像 Promise.all 那样直接抛出错误,需要开发者手动处理每个 Promise 的状态。如果需要统一捕获异常,可以将处理 Promise 的代码放到
catch()
链式调用中,并捕获所有未捕获的异常。 - Promise.allSettled 一旦有某个 Promise 被 rejected,是不会影响其他 Promise 的执行的。
结语
本文详细介绍了 Promise.allSettled 的用法、特性和示例,并指出 Promise.allSettled 与 Promise.all 的区别和注意事项。通过学习本文,你将掌握 Promise.allSettled 的使用技巧,为你的前端开发提供便利和效率。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67c8c506e46428fe9ef85a7f