如何使用 Promise.allSettled

阅读时长 5 分钟读完

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 接受一个可迭代对象(例如数组),该对象的每一个成员都是一个 Promise 实例。如果不是 Promise 实例,则会先调用 Promise.resolve 方法将其转换为 Promise 实例。

Promise.allSettled 返回一个新的 Promise 实例,该实例在所有 Promise 都 settled 后进行 resolve,resolve 的值是一个数组,数组的每一项都是一个对象,分别表示原 Promise 实例的状态和结果。对象的属性有:

  • status:Promise 的状态,可能为 fulfilledrejected
  • value:Promise fulfilled 的结果,如果状态为 rejected 则不存在该属性
  • reason:Promise rejected 的结果,如果状态为 fulfilled 则不存在该属性

Promise.allSettled 的示例

下面是一个示例,使用 Promise.allSettled 并行执行多个 Promise,并打印每个 Promise 的状态和结果:

-- -------------------- ---- -------
----- -------- - -
  -------------------
  ------------------ ----------------
  -------------------
--

----------------------------
  ------------- -- -
    ---------------------- -- -
      --------------------------- -- --------- - --------
      -- -------------- --- ------------ -
        -------------------------- -- -----
      - ---- -
        --------------------------- -- -----
      -
    ---
  ---
展开代码

上述代码执行结果如下:

我们可以看到,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

纠错
反馈

纠错反馈