ES2021 中的 Promise.any 和 Promise.allSettled 两种异步处理方式的比较

阅读时长 4 分钟读完

在 ES2020 中,Promise.all 方法可以接受多个 Promise 实例作为参数,返回一个新的 Promise 实例。当所有的 Promise 实例都执行成功时,新的 Promise 实例才会执行成功;只要其中有一个 Promise 实例执行失败,新的 Promise 实例就会执行失败。这是非常常见的异步处理方式。不过,在 ES2021 中,Promise.any 和 Promise.allSettled 两个新的方法被引入,这两种方法同样可以处理多个 Promise 实例,但它们的行为与 Promise.all 略有不同。

Promise.any

Promise.any 方法可以用来处理多个 Promise 实例,返回一个新的 Promise 实例,该 Promise 实例在任何一个 Promise 实例成功之后就会立即执行,并且返回成功的 Promise 实例的值。

下面是一个 Promise.any 的示例代码:

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

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

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

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

在该代码中,有三个 Promise 实例,其中 promise3 是一个失败的 Promise 实例。Promise.any 方法会返回 promise1 或 promise2 中先完成的 Promise 实例的结果,不管它们成功或失败。这里返回的值是 'promise1',因为 promise1 是先完成的 Promise 实例。

Promise.allSettled

Promise.allSettled 方法和 Promise.all 方法类似,可以处理多个 Promise 实例,返回一个新的 Promise 实例。不过,不同的是,即使其中有 Promise 实例抛出了一个未处理的异常,它也会继续执行,直到所有的 Promise 实例都执行完毕。

下面是一个 Promise.allSettled 的示例代码:

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

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

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

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

在该代码中,promise2 抛出了一个异常,但是 Promise.allSettled 方法仍然会返回一个数组,包含所有 Promise 实例的状态。promise1 的状态为 'fulfilled',promise2 的状态为 'rejected',promise3 的状态为 'fulfilled'。该数组中的每个元素都是一个对象,包含了 Promise 的状态和值(如果有)或原因(如果失败了)。

总结

Promise.any 和 Promise.allSettled 两种新的异步处理方式在处理多个 Promise 实例时,都有它们的优点。Promise.any 能够快速响应任何一个 Promise 实例的成功,而不用等待其他的 Promise 实例的执行。如果需要处理的 Promise 实例数量较多,可以通过 Promise.allSettled 来遍历所有的 Promise 实例的状态。在项目开发中,可以根据实际需求来选择使用哪种方式。

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

纠错
反馈