ES10 中新增的 Promise.allSettled 方法详解及使用示例

阅读时长 4 分钟读完

前言

在 JavaScript 中,Promise 是一种非常常见的异步编程方式。在 ES2015 中,Promise 被正式引入了标准库,成为了 JavaScript 中的一等公民。Promise 可以让我们更加方便地处理异步操作,避免了回调地狱的问题。

在 ES10 中,Promise 新增了一个方法:Promise.allSettled。这个方法可以帮助我们更好地处理一组 Promise 的状态,下面我们来详细了解一下这个方法。

Promise.allSettled 方法

Promise.allSettled 方法接收一个 Promise 数组作为参数,返回一个新的 Promise,这个 Promise 在所有 Promise 都完成后才会被 resolve,resolve 的值是一个数组,数组中的每个元素都是一个对象,表示对应的 Promise 的状态。

这个对象包含两个属性:

  • status: 表示 Promise 的状态,可能的值为 "fulfilled" 或 "rejected"。
  • value: 如果 Promise 的状态为 "fulfilled",则 value 表示 Promise 的返回值;如果 Promise 的状态为 "rejected",则 value 表示 Promise 的 reject 原因。

下面是一个使用 Promise.allSettled 方法的示例:

输出结果为:

可以看到,Promise.allSettled 方法返回了一个数组,数组中包含了每个 Promise 的状态和返回值。

Promise.allSettled 方法的应用场景

Promise.allSettled 方法的主要应用场景是:当我们需要等待多个异步操作都完成后,才能进行下一步操作时,我们可以使用 Promise.allSettled 方法来等待所有异步操作完成。

在之前的版本中,我们可能会使用 Promise.all 方法来实现这个功能,但是 Promise.all 方法会在任何一个 Promise 被 reject 后立即 reject,这样就会导致其他 Promise 的结果被忽略。

使用 Promise.allSettled 方法可以避免这个问题,因为它会等待所有 Promise 的状态都被 settled 后再返回结果。

下面是一个使用 Promise.allSettled 方法的示例:

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

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

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

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

这个示例中,我们定义了一个 fetchUsers 函数,这个函数会返回一个 Promise,这个 Promise 会等待三个 fetch 请求都完成后才会 resolve。在 then 方法中,我们过滤出了所有状态为 "fulfilled" 的 Promise,然后通过 map 方法将这些 Promise 转换成 JSON 格式的数据。最后,我们又使用 Promise.all 方法等待所有 Promise 完成后再输出结果。

总结

ES10 中新增的 Promise.allSettled 方法可以帮助我们更好地处理一组 Promise 的状态,避免了在 Promise.all 方法中由于一个 Promise reject 导致其他 Promise 被忽略的问题。在实际应用中,我们可以使用 Promise.allSettled 方法来等待多个异步操作都完成后再进行下一步操作。

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

纠错
反馈