ES10 之 Promise.allSettled 及 Promise.any

阅读时长 5 分钟读完

在 JavaScript 的语言特性中,Promise 已经被广泛应用于异步编程。在 ES6 中,引入了 Promise 来解决回调地狱的问题,使得异步编程更加简单与方便。而在 ES10 中,新增了两个有用的 Promise 方法:Promise.allSettled 和 Promise.any。

Promise.allSettled

通过 Promise.all 方法,我们可以将多个 Promise 实例组合成一个新的 Promise 实例。当所有的实例都成功时,新的实例才会成功,否则新的实例的状态就变为 rejected。

Promise.allSettled 与 Promise.all 有相同的作用,也是将多个 Promise 实例组合成一个新的实例。不同的是,两者在处理 reject 的情况时有所不同。

如果使用 Promise.all,当其中一个 Promise 实例变为 rejected 状态时,新实例也会立即变为 rejected 状态。而 Promise.allSettled 会等待所有的实例执行完毕,然后返回包含所有实例的状态的一个数组,包括 fulfilled 和 rejected。

下面是一个使用 Promise.allSettled 的例子:

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

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

在这个例子中,我们首先定义了一个包含三个 Promise 实例的数组。第一个和第二个 Promise 实例获取了 HTML 文档中的两个元素节点,第三个 Promise 实例则是手动抛出了异常。

然后,我们使用 Promise.allSettled 将三个 Promise 实例组合成一个新的 Promise 实例。在 then 方法中,判断每个 Promise 实例的状态,如果是 fulfilled,则输出其结果,如果是 rejected,则输出异常信息。

Promise.any

与 Promise.allSettled 不同,Promise.any 只要有一个 Promise 实例状态变为 fulfilled,就会返回该实例的结果。如果所有的 Promise 实例都变为 rejected,则 Promise.any 也会向外部抛出异常。

Promise.any 和 Promise.race 用法类似,都是返回第一个成功/失败的 Promise 实例。不同的是,当 Promise.race 的实例有一个变为 fulfilled 时,就会返回该实例的结果;当所有的实例都变为 rejected 时,则会抛出异常。而 Promise.any 只有当有一个实例变为 fulfilled 时,才会返回该实例的结果;当所有的实例都变为 rejected 时,也会向外部抛出异常。

下面是一个使用 Promise.any 的例子:

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

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

在这个例子中,我们定义了一个包含三个 fetch 请求的数组。使用 Promise.any 将三个实例组合成一个新的实例,当其中某一个实例状态变为 fulfilled 时,则输出其结果。如果所有的实例都变为 rejected,也就是请求全部失败,则向外部抛出异常。

指导意义

Promise.allSettled 和 Promise.any 的实现,是为了弥补 Promise.all 处理 reject 情况的不足。Promise.all 在处理多个 Promise 实例时,在有一个实例出现错误时就将整个操作处理为一个失败状态,这导致服务端请求异常信息很难收集和处理。

Promise.allSettled 和 Promise.any 的加入,不仅弥补了 Promise 的不足,使得 Promise 的使用更加灵活和方便,更尤其为一些使用服务端编程语言的开发人员,提供了一件很有用的工具,使得他们对服务端异常信息的收集和处理变得更加简单。

总结

Promise.allSettled 和 Promise.any 在 Promise API 的操作中都属于比较新的 API,两者的应用场景各不相同。Promise.any 可以用于处理多个执行请求的返回结果,当其中一个请求返回成功时会快速返回成功;而 Promise.allSettled 可以用于将多个异步操作汇集到一起,得出所有实例的结果集合。

由于 Promise.allSettled 和 Promise.any 是新加入的 API,需要对浏览器的兼容性进行考虑。对于不支持这两种 API 的浏览器或者环境,需要使用 babel 等转换工具来实现兼容性。

最后,虽然这两个 API 工作机制较为复杂,但是了解其原理并掌握其实现方法,对于提升异步编程的能力是比较重要的。

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

纠错
反馈