Promise.any() 与 Promise.race() 的区别

阅读时长 4 分钟读完

前言

在前端开发中, Promise 是一种非常常用的异步编程方式。其中 Promise.any() 和 Promise.race() 是两个经常混淆的方法。

本文将着重介绍 Promise.any() 和 Promise.race() 的区别。

Promise.any()

Promise.any() 是一个比较新的 Promise API,可以把多个 Promise 实例包装成一个新的 Promise 实例,只要有一个 Promise 成功,即返回此 Promise 的结果,如果所有 Promise 都失败,返回一个 AggregateError 类型的错误。

举个例子:

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

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

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

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

上面的代码用了 three 个 Promise,其中 promise1 和 promise2 分别在 1s 和 2s 后解析或拒绝,而 promise3 在 3s 后解析。因为 promise1 成功了,所以返回 promise1 的结果,即 promise1。如果 promise1 和 promise2 都以失败结尾,那么返回的是 AggregateError: All promises were rejected.

Promise.race()

Promise.race() 跟 Promise.all() 类似,也是传入多个 Promise 实例,并返回一个新的 Promise 实例。不同的是,只有一旦其中一个 Promise 实例对象变为“成功”或“失败”时,会将其结果传递给回调。如果传递的数据是一个数组或迭代器则使用有序的方式处理。

举个例子:

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

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

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

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

上面的代码用了 three 个 Promise,其中 promise1 和 promise2 分别在 1s 和 2s 后解析或拒绝,而 promise3 在 3s 后解析。因为 promise1 解析的时间最短,所以返回其解析结果,即 promise1。如果 promise2 成功而 promise1 和 promise2 都已经成功,则返回 promise2。如果三个 Promise 实例都拒绝,它返回的是最后一个抛出的异常,即 promise2

区别

Promise.any() 可以实现“或”操作,也就是只要有一个 Promise 实例成功就返回,而 Promise.race() 可以实现“与”操作,也就是只有当所有 Promise 实例都没有失败时才返回,且返回速度以最快的 Promise 实例为准。

结语

通过本文,你应该已经理解了 Promise.any() 和 Promise.race() 的差异之处。在实际项目中,我们应根据具体需要选择适合的 API,从而提高代码性能以及开发效率。

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

纠错
反馈