ECMAScript 2021 中的 Promise 的更新

阅读时长 7 分钟读完

在 ECMAScript 2021 中,Promise 类型得到了一些重要的更新,这些更新使得 Promise 更加强大和实用。在本文中,我们将介绍这些更新,并提供一些示例代码来帮助你更好地理解这些更新。

新的静态方法:Promise.any()

在过去,如果你需要等待多个 Promise 中的任意一个完成,你需要使用 Promise.race() 方法。但是,Promise.race() 方法有一个缺点,就是如果其中一个 Promise 被拒绝(rejected),整个 Promise 都会被拒绝。这对于一些场景来说并不是很理想。

在 ECMAScript 2021 中,我们可以使用 Promise.any() 方法来解决这个问题。Promise.any() 方法会等待多个 Promise 中的任意一个完成,并返回完成的 Promise 的值。如果所有的 Promise 都被拒绝,Promise.any() 方法会返回一个 AggregateError 类型的错误,其中包含所有被拒绝的 Promise 的错误信息。

下面是一个使用 Promise.any() 方法的示例代码:

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

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

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

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

在上面的代码中,我们创建了三个 Promise,其中第一个和第二个会在 1 秒和 2 秒后完成,返回 'foo' 和 'bar'。第三个 Promise 会在 3 秒后被拒绝,返回一个错误信息。我们使用 Promise.any() 方法等待这三个 Promise 中的任意一个完成,并输出完成的 Promise 的值。在这个例子中,由于第一个和第二个 Promise 都是完成的,我们会输出 'foo' 或 'bar'。如果所有的 Promise 都被拒绝,我们会输出一个包含所有错误信息的 AggregateError。

新的实例方法:Promise.prototype.finally()

在过去,如果你需要在 Promise 完成后执行一些代码,无论 Promise 是成功还是失败,你需要使用 Promise.prototype.then() 方法。但是,Promise.prototype.then() 方法有一个缺点,就是它会改变 Promise 的状态和值,这可能会导致一些意想不到的结果。

在 ECMAScript 2021 中,我们可以使用 Promise.prototype.finally() 方法来解决这个问题。Promise.prototype.finally() 方法会在 Promise 完成后执行一些代码,无论 Promise 是成功还是失败,并返回原始的 Promise 对象。这意味着 Promise.prototype.finally() 方法不会改变 Promise 的状态和值。

下面是一个使用 Promise.prototype.finally() 方法的示例代码:

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

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

在上面的代码中,我们创建了一个 Promise,它会在 1 秒后完成,返回 'foo'。我们使用 Promise.prototype.then() 方法来输出这个值。然后,我们使用 Promise.prototype.catch() 方法来捕获任何错误。最后,我们使用 Promise.prototype.finally() 方法来输出一条消息,表示 Promise 已经完成了。在这个例子中,无论 Promise 是成功还是失败,我们都会输出 'Promise is completed.'。

新的实例方法:Promise.prototype.allSettled()

在过去,如果你需要等待多个 Promise 都完成后再执行一些代码,你需要使用 Promise.all() 方法。但是,Promise.all() 方法有一个缺点,就是如果其中一个 Promise 被拒绝(rejected),整个 Promise 都会被拒绝。这对于一些场景来说并不是很理想。

在 ECMAScript 2021 中,我们可以使用 Promise.prototype.allSettled() 方法来解决这个问题。Promise.prototype.allSettled() 方法会等待多个 Promise 都完成,并返回一个包含所有 Promise 的状态和值的数组。这个数组中的每个元素都是一个对象,它包含一个 status 属性和一个 value 或 reason 属性,分别表示 Promise 的状态和值或原因。

下面是一个使用 Promise.prototype.allSettled() 方法的示例代码:

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

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

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

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

在上面的代码中,我们创建了三个 Promise,其中第一个和第三个会在 1 秒和 3 秒后完成,返回 'foo' 和 'baz'。第二个 Promise 会在 2 秒后被拒绝,返回一个错误信息。我们使用 Promise.prototype.allSettled() 方法等待这三个 Promise 都完成,并输出它们的状态和值或原因。在这个例子中,我们会输出一个数组,它包含三个元素,分别表示这三个 Promise 的状态和值或原因。

结论

在 ECMAScript 2021 中,Promise 类型得到了一些重要的更新,这些更新使得 Promise 更加强大和实用。Promise.any() 方法可以让我们等待多个 Promise 中的任意一个完成,而不会因为其中一个 Promise 被拒绝而导致整个 Promise 被拒绝。Promise.prototype.finally() 方法可以让我们在 Promise 完成后执行一些代码,无论 Promise 是成功还是失败,而不会改变 Promise 的状态和值。Promise.prototype.allSettled() 方法可以让我们等待多个 Promise 都完成,并返回它们的状态和值或原因,而不会因为其中一个 Promise 被拒绝而导致整个 Promise 被拒绝。这些更新为我们在使用 Promise 时提供了更多的灵活性和便利性。

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

纠错
反馈