如何使用 ES6/ES7 和 ES10 中的 Promise.allSettled()

阅读时长 4 分钟读完

Promise.allSettled() 是 ES2020 (也称为 ES10)中的一个新 API,它是 Promise.all() 方法的一种变体。 Promise.allSettled() 方法接受一个 Promise 对象的数组,并且在所有 Promise 对象都解析后返回一个 Promise 对象,该对象包含一个对象数组,每个对象都表示相应 Promise 对象的状态。

在本文中,我们将学习如何使用 Promise.allSettled() 来处理 Promise 集合,并将快速了解 Promise 对象的基础知识。 我们还将建议一个使用 Promise.allSettled() 的示例,以帮助你更好地理解它的工作方式。

Promise 对象基础知识

在学习 Promise.allSettled() 之前,我们需要了解几个与 Promise 相关的基础知识。首先,Promise 对象是一种用于处理异步操作的对象。 一个 Promise 对象包含三种状态:Pending(进行中)Fulfilled(已成功)Rejected(已失败)

创建一个 Promise 对象的代码如下所示:

在上面的例子中,我们创建了一个 Promise 对象,并在 Promise 构造函数中定义了异步操作的逻辑。如果异步操作成功,则调用 resolve() 方法,并指定成功的结果。如果异步操作失败,则调用 reject() 方法,并指定失败的原因。

Promise.allSettled() 解决了什么问题?

当我们有多个 Promise 对象时,通常需要等待所有 Promise 对象都成功解决(即处于 Fulfilled 状态)或至少一个 Promise 对象被拒绝(即处于 Rejected 状态)才能继续执行。我们可以使用 Promise.all() 方法来处理这种情况。

但我们可能遇到一种情况,即我们需要知道所有 Promise 对象的状态,而不仅仅是在所有 Promise 对象都已解决时才返回。例如,假设我们正在从不同的数据源中获取数据,我们需要检查每个数据源的状态,而不仅仅是在所有数据源都已成功返回时才继续。

在类似这种情况下,我们可以使用 Promise.allSettled() 方法。

使用 Promise.allSettled()

语法

Promise.allSettled(iterable)

iterable 是一个具有 Iterator 接口的对象,它是包含多个 Promise 对象的可迭代对象。

返回值

一个 Promise 对象,在所有 Promise 对象都已解决后被成功地解决(即处于 Fulfilled 状态),并返回一个对象数组,其中每个对象都包含有关其对应 Promise 对象的状态和结果。

示例代码

假设我们有两个异步函数,fetchData1()fetchData2(),它们从不同的数据源中获取数据。我们可以使用 Promise.allSettled() 来获取它们的状态,如下所示:

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

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

在上面的代码中,我们使用 Promise.allSettled() 方法来获取两个 Promise 对象的状态。然后,我们在 .then() 方法中遍历每个解决方案,检查其状态是否成功。如果成功,则使用 result.value 访问其结果。如果失败,则使用 result.reason 访问其失败原因。

总结

使用 Promise.allSettled() 方法可以方便地获取多个 Promise 对象的状态,而不仅仅在所有 Promise 对象都已解决时才返回。 它是一个非常有用的功能,可以帮助我们更好地控制异步操作。

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

纠错
反馈