ES9 新特性:新增 Promise.allSettled()

阅读时长 4 分钟读完

介绍

在 JavaScript 的 Promise 中,Promise.all() 是一个非常常见的用来处理多个 Promise 的方法,但是在处理多个 Promise 的时候,我们通常只关心所有 Promise 是否都成功了,而不关心其中某一个 Promise 失败的情况。这就导致了一个问题,当其中一个 Promise 失败时,Promise.all() 就会立即返回一个以该 Promise 的错误信息为理由被拒绝的 Promise,而其它已经成功了的 Promise 的返回结果就被忽略了。这样很不方便,如果我们必须等待所有 Promise 都返回后才能继续后续操作,就需要借助 Promise.all() 的异常处理能力,但是这也非常不优雅。

在 ES9 中,新添加了一个方法:Promise.allSettled(),它能够同时返回成功和失败的 Promise,它需要等待所有的 Promise 都执行完毕,而不是像 Promise.all() 一样在第一个 Promise 失败时立即返回。

使用方法

Promise.allSettled() 接受一个数组参数,数组中的每一项都是一个 Promise 对象。

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

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

在上面的代码中,我们定义了一个数组 promises,其中包括了三个 Promise 对象,分别代表了一个成功的 Promise、一个失败的 Promise 和另一个成功的 Promise。

当我们执行 Promise.allSettled(promises) 时,它会等待所有 Promise 执行完毕,然后会将执行结果以 Promise 类型返回,同时 Promise 返回的结果是一个数组,数组中保存了每个 Promise 执行的结果。

Promise.allSettled() 返回结果

Promise.allSettled() 返回的 Promise 的结果是一个数组,数组中每一个元素都是一个对象,该对象包含了 Promise 的执行结果信息,格式如下:

  • status:表示 Promise 的执行状态,可能为 fulfilled 或 rejected,分别代表着 Promise 执行成功或失败。
  • value:如果 Promise 已成功执行,则为 Promise 的返回值;如果 Promise 执行失败,则为 Promise 的错误原因。

总结

Promise.allSettled() 是 ES9 新特性中的一个很实用的方法,它允许我们等待所有 Promise 执行完成后对每个 Promise 的执行结果进行处理,并且它不会在某一个 Promise 失败时终止后续执行。

下面是使用 Promise.allSettled() 方法解决多个 Promise 并发执行问题的简单示例:

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

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

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

在上面的代码中,我们使用 Promise.allSettled() 方法同时发起了三个请求。当所有请求都处理完成后,我们过滤所有成功的请求和失败的请求,并分别输出它们的个数。

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

纠错
反馈