ECMAScript 2020 中的 Promise.allSettled 能力及使用场景

阅读时长 6 分钟读完

ECMAScript 2020 中的 Promise.allSettled 能力及使用场景

在现代的 JavaScript 中,Promise 对象已成为非常重要的异步编程方式。ES6 中的 Promise 已经提供了 then() 和 catch() 方法,用于处理异步操作的结果。ES2020 中引入的 Promise.allSettled() 方法扩展了 Promise 的能力,使得开发者能够更轻松地处理多个 Promise 对象的状态。

Promise.allSettled() 方法会返回一个新的 Promise 对象,并等待所有的 Promise 对象都已经 settle(fulfill 或 rejected)后,返回一个由所有 Promise 对象处理结果组成的数组。这是与 Promise.all() 方法的最大区别,因为 Promise.all() 方法会在任何一个 Promise 对象被 rejected 后立即返回 rejected 结果。

Promise.allSettled() 方法的语法如下:

其中 iterable 参数可以是具有迭代器接口的任何对象(Array、Set、Map 等)。

接下来,让我们看一些使用 Promise.allSettled() 方法的场景。

使用场景

  1. 处理多个 Promise 对象的结果

Promise.allSettled() 方法可以方便地处理多个 Promise 对象的结果。例如,我们可以使用 Promise.allSettled() 方法来确保所有的异步操作已完成,然后处理它们的结果。

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

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

在上面的代码中,第一个 Promise 对象被 fulfilled,第二个 Promise 对象被 rejected,第三个 Promise 对象被 fulfilled。Promise.allSettled() 方法返回了一个由三个对象组成的数组,每个对象都包含了对应的 Promise 对象的状态和值或原因。

输出结果如下:

  1. 忽略 rejected 的 Promise 对象

如果我们希望只处理 fulfilled 状态的 Promise,而忽略所有 rejected 状态的 Promise,我们可以使用 Promise.allSettled() 方法与 Array.prototype.filter() 方法结合使用。

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

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

在上面的代码中,我们使用 Promise.allSettled() 方法来获取所有 Promise 对象的处理结果,然后使用 Array.prototype.filter() 方法过滤掉 rejected 状态的 Promise 对象,最后输出 fulfilled 状态的 Promise 的结果。

输出结果如下:

  1. 并行处理异步操作

我们可以结合 Promise.allSettled() 方法和 Async/Await 来并行处理异步操作。例如,我们可以使用 Promise.allSettled() 方法来并行处理多个请求,并等待所有请求都已响应后再处理响应数据。

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

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

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

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

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

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

在上面的代码中,我们使用 Promise.allSettled() 方法来并行发送多个请求,并等待所有请求都已响应后再处理响应数据。我们使用 Array.prototype.filter() 方法过滤掉 rejected 状态的 Promise 对象,使用 Promise.all() 方法等待所有请求数据都已解析,并将所有数据组成的数组返回。

总结

Promise.allSettled() 方法是一个非常实用的方法,可以让我们更轻松地处理多个异步操作的结果。它返回由所有 Promise 对象处理结果组成的数组,无论是被 fulfill 还是 reject。我们可以结合 Promise.allSettled() 方法和其他语言特性(如 Async/Await)来更方便地处理异步操作,提高代码的可读性和可维护性。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64cc69555ad90b6d0428056d

纠错
反馈

纠错反馈