ECMAScript 2021 中的 Promise 详解

阅读时长 6 分钟读完

在现代 Web 开发中,JavaScript 已经成为了一门非常重要的语言。ECMAScript 2021(简称 ES2021)是 JavaScript 的最新标准,包含了许多新的特性和改进。其中很重要的一个特性就是 Promise。Promise 是一种异步编程的方式,它的目的是让异步代码更加易于编写和理解,避免了回调地狱的问题。本文将详细介绍 ES2021 中的 Promise。

Promise 简介

Promise 是一种异步编程的方式,它可以管理异步操作的状态和结果。Promise 可以有三种状态:待定(pending)、已完成(fulfilled)和已拒绝(rejected)。一个 Promise 实例最初是处于待定状态,随着异步操作的执行结果,状态会发生变化。当异步操作执行成功时,Promise 的状态就变成已完成;当异步操作执行失败时,Promise 的状态就变成已拒绝。

我们可以使用 Promise 的 then() 方法来注册回调函数,以处理异步操作的结果。then() 方法接收两个参数:一个成功回调函数和一个失败回调函数。当异步操作成功时会调用成功回调函数,传入异步操作的结果作为参数;当异步操作失败时会调用失败回调函数,传入错误对象作为参数。下面是一个简单的 Promise 示例:

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

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

上面的示例中,Promise 使用了一个定时器模拟了一个异步操作。定时器会在一秒钟后执行,然后调用 resolve() 方法传入字符串 'Hello, Promise!'。在成功回调函数中,我们打印了这个字符串。

Promise 新特性

ES2021 中引入了一些新的 Promise 特性,下面分别进行介绍。

Promise.any()

Promise.any() 方法接收一个 Promise 实例数组作为参数,只要其中的任意一个 Promise 成功,它就会返回成功,并传递成功 Promise 的结果作为参数。如果所有的 Promise 都失败了,它会返回失败,并传递一个 AggregateError 对象作为失败原因。下面是一个 Promise.any() 的示例:

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

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

在上面的示例中,我们创建了一个包含三个 Promise 的数组。其中的第一个和第三个 Promise 都会失败,而第二个 Promise 会成功。我们通过 Promise.any() 方法来处理这些 Promise,当第二个 Promise 成功时,它就会传递这个 Promise 的结果 'Success 2'。如果所有的 Promise 都失败了,它就会返回一个 AggregateError 对象,这个对象包含了所有失败 Promise 的错误。

Promise.allSettled()

Promise.allSettled() 方法接收一个 Promise 实例数组作为参数。它会等待数组中的所有 Promise 完成,并返回一个新的 Promise。这个新的 Promise 在所有 Promise 都完成后才会完成,并返回一个对象数组,其中每个对象表示一个完成的 Promise 的状态和结果。下面是一个 Promise.allSettled() 的示例:

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

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

在上面的示例中,我们创建了一个包含三个 Promise 的数组。我们通过 Promise.allSettled() 方法来处理这些 Promise,当它们都完成后,它会返回一个对象数组。这个数组中的每个对象都包含一个 status 字段,表示 Promise 的状态,可能的值为 fulfilled 或 rejected,并包含一个 value 字段或一个 reason 字段,分别表示成功结果或失败原因。

Promise.any()

Promise.all() 方法接收一个 Promise 实例数组作为参数,当数组中的所有 Promise 都成功时,它就会返回成功,并传递所有 Promise 的结果作为数组形式的参数。当数组中的任意一个 Promise 失败时,Promise.all() 就会返回失败,并传递失败的 Promise 的原因作为失败原因。下面是一个 Promise.all() 的示例:

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

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

在上面的示例中,我们创建了一个包含三个 Promise 的数组。当这些 Promise 都成功时,Promise.all() 就会返回成功,并传递一个包含所有成功 Promise 结果的数组 ['Success 1', 'Success 2', 'Success 3']。

总结

Promise 是一种非常重要的异步编程方式,它可以使我们更加简单和清晰地处理异步操作的状态和结果。ES2021 中引入了一些新的 Promise 特性,如 Promise.any()、Promise.allSettled() 和 Promise.all(),它们可以让我们更加便捷地处理异步操作。在实际开发中,我们应该根据具体情况选择使用这些新特性。

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

纠错
反馈