ES10 Promise.allSettled 简单易懂的实例教程

阅读时长 4 分钟读完

在 ES2020 中,Promise.allSettled 被正式引入,这个 API 可以使得更容易地处理异步操作完成后的结果。本篇文章将为你介绍 Promise.allSettled 的使用方法和实例教程。

Promise.allSettled 简介

Promise.allSettled 可以接收并发所有的 Promise,返回一个新的 Promise 实例。这个新的实例在所有的子 Promise 完成后才会被 resolve。返回的结果包含了一个对象数组,其中每个对象描述了对应的子 Promise 完成状态信息。

状态信息

Promise.allSettled 返回的状态信息分为以下两种:

  • fulfilled:子 Promise 成功 resolve 后的状态,包含一个 value 属性,记录 resolve 的值。
  • rejected:子 Promise 失败后的状态,包含一个 reason 属性,记录失败的原因。

语法

Promise.allSettled(iterable)

参数

  • iterable:一个可迭代的对象,比如数组,其中包含了一个或多个 Promise。

返回值

  • 返回一个 Promise,其结果等于所有子 Promise 的状态情况,包含一个对象数组,其中每个对象描述了对应的子 Promise 完成状态信息。

实例教程

我们可以使用 Promise.allSettled 来并发执行多个异步操作,最后将所有异步操作的结果一起返回。比如,我们有三个请求需要并行加载,我们使用 Promise.allSettled 可以方便地获取到这三个请求的结果。

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

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

这个示例中,我们定义了三个异步请求操作,使用 fetch API 去获取数据。然后使用 Promise.allSettled 将这三个 Promise 并行执行,一旦这三个请求拿到数据,它们的状态会被成功 resolve,同时我们将这三个 Promise 作为参数传入 Promise.allSettled 中。

最后我们使用 results.map 迭代所有的子 Promise 的状态信息,解析每个 Promise 是否成功,如果成功,我们就将其数据获取到,否则返回 false。

如果你要想获得所有 Promise 的结果,包括 rejected 状态的 Promise,可以修改上面例子中的代码如下:

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

这里我们将 else 分支修改为返回 result.reason。如果 Promise reject,result.reason 就是 reject 的原因。

总结

在这篇文章中,我们学习了 Promise.allSettled 的基本用法和实例教程。这个 API 能够让我们更方便地处理异步操作并发的结果。现在你可以开始使用 Promise.allSettled 来优化你的代码了!

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

纠错
反馈