ES11 Promise.allSettled() 方法一览

阅读时长 7 分钟读完

最新的 ECMAScript 2020 (ES11)中,引入一个新的 Promise.allSettled() 方法,这个方法允许我们一次性处理多个 Promise 对象的执行结果,无论成功或者失败。在本文中,我们将详细介绍这个新方法的用法和语法,并同时给出一些实际代码示例。

语法

Promise.allSettled() 方法接受一个 Promise 数组作为参数,返回一个新的 Promise 对象。这个新的 Promise 对象的完成状态和原来的 Promise 对象数组的状态有关,具体表现为以下几种情况:

  1. 当所有的 Promise 对象都成功完成时,这个新的 Promise 对象也成功完成,并返回一个结果数组,这个结果数组中的每一个元素代表对应原来的 Promise 对象的成功执行结果。
  2. 当所有的 Promise 对象都已经完成(即无论成功或者失败)时,这个新的 Promise 对象也完成,并返回一个结果数组,这个结果数组中的每一个元素代表对应原来的 Promise 对象的执行结果,无论成功或失败。
  3. 当所有的 Promise 对象中至少有一个失败时,这个新生成的 Promise 对象也失败,并返回一个错误数组,这个错误数组中的每一个元素代表对应原来的 Promise 对象的错误信息。

下面是 Promise.allSettled() 方法的语法:

其中,iterable 表示一个可以迭代的对象,比如数组和字符串等。

实例

下面我们来看看 Promise.allSettled() 方法的实际使用案例。

成功情况

在下面的示例中,我们创建了两个 Promise 对象,这两个 Promise 对象都是在指定时间后才成功完成,然后我们使用 Promise.allSettled() 方法将它们合并到一个 Promise 对象里:

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

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

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

在上面的代码中,由于我们分别在 3 秒和 5 秒之后,才让两个 Promise 对象成功完成,所以通过 Promise.allSettled() 方法返回的结果数组中,每一个元素的状态都是 "fulfilled",并且每一个 Promise 对象的成功结果也都能够得到返回。在运行上面的代码后,控制台输出如下:

混合情况

我们再来看看一个更加复杂的例子。在下面的代码中,我们创建了三个 Promise 对象,分别表示了成功、失败和延迟执行的任务,然后我们将这三个 Promise 对象用 Promise.allSettled() 方法合并成一个新的 Promise 对象,并最终输出这个新 Promise 对象在完成后返回的状态。

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

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

在运行上面的代码之后,我们会看到如下输出,这个输出展示了在这个新的 Promise 对象中,每一个元素代表对应原来的 Promise 对象的执行结果:

在上面的输出中,第一个元素代表的是成功的任务,返回的值为 1;第二个元素代表的是失败的任务,打印出来的是一个错误消息;第三个元素代表的是延迟执行的任务,成功完成后返回了一个字符串结果。

错误处理

除了 Promise.all() 方法和 Promise.race() 方法之外,ES6 中的 Promise 并没有提供一种清晰地处理 Promise 数组中的错误信息的方式。在这种情况下,我们通常需要使用 Promise.all() 配合 catch() 方法等方式来捕捉 Promise 数组中的错误信息。

但是,现在有了 Promise.allSettled() 方法,我们就能够更加方便地处理这些错误信息了。事实上,我们只需要在 Promise.allSettled() 方法的返回结果中,遍历所有状态为 rejected 的元素,然后即可获取到它们各自的错误信息。例如:

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

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

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

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

在上面的代码中,我们在第二个 Promise 对象中添加了一个 reject() 方法,以模拟它的失败情况。然后,我们在 Promise.allSettled() 方法的处理回调函数中,遍历每一个返回的结果对象,在状态为 rejected 的情况下,将错误信息 push 到一个称为 errors 的数组里面。最后,我们通过 console.log 来打印出这个 errors 数组,输出它的结果为一个 Error 对象。

总结

在本文中,我们介绍了 ES11 中的 Promise.allSettled() 方法,这个方法允许我们一次性处理多个 Promise 对象的执行结果,无论成功或者失败。我们从语法、使用案例和错误处理三个方面对这个新方法进行了详细的剖析,并给出了多个实际的代码示例。如果你想更好地使用 Promise 对象来处理异步任务,那么 Promise.allSettled() 方法一定是一个不可或缺的工具。

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

纠错
反馈