JavaScript Promise.any() 方法

2025年4月23日 | 阅读 6 分钟

当我们在可迭代对象(如数组)中提供的任何一个 Promise 被成功fulfilled(履行)或resolved(解决)时,该过程将返回一个接受(accept)或拒绝(reject)的 Promise。

Promise.any() 是并发 Promise 方法之一。通过这种方式返回第一个 fulfilled 的 Promise 非常有用。一旦一个 Promise 被 fulfilled,它就会短路,而不是等待其他 Promise 遵循。

Promise.any() 会在传入的 Promise 中至少有一个被满足时resolved,如果所有 Promise 都未被满足,则会以 AggregateError 被rejected。

语法

下面的语法展示了带有输入 Promise 参数的 Promise.any() 方法。

解释: Promise.any() 返回一个单一的 Promise,当数组对象中的任何一个 Promise 被 fulfilled 时,该 Promise 将解析为被 fulfilled 的 Promise 的结果值。

返回值: 此方法返回以下值

如果提供的参数是 void,则返回一个已 fulfilled 的 Promise。

在所有其他情况下,会创建一个待定(pending)的 Promise,其中包含传入的每个 Promise 的值和特定状态。

  • 状态(status)和值(value)是每个对象的两个属性。
  • 状态是 accepted(接受)或 fulfilled(履行)。
  • 如果 Promise 被 fulfilled,则为 value,如果被 rejected,则为 reason(原因)。

Promise.any() 方法的工作流程

  • any() 是 Promise 对象上最受欢迎的方法之一,它用于执行任何已成功 fulfilled 且当前未处于 rejected 状态的 Promise。
  • 此方法将 rejection 并阻止rejected状态的 Promise 的执行。
  • 如果队列中有四个 Promise,其中三个成功执行(即“resolved”),而其中一个被 rejected,那么最快 fulfilled 的 Promise 将首先执行,而后续的 Promise 可能不会被执行。
  • 在某种程度上,Promise.any() 方法的行为类似于 Promise.
  • 使用 race() 方法时,只有成功 fulfilled 的 Promise 会首先执行;其他 Promise 不会。

图表

输入参数图

下图显示了所有 Promise 都 fulfilled 的 Promise.any() 方法的操作。

JavaScript Promise.any() Method
  • 在时间 t1,promise1 解析为值 v1。
  • 在时间 t2,promise2 解析为值 v2。
  • Promise.any() 函数返回一个 Promise,该 Promise 在时间 t1 解析为值 v1。

即使可迭代对象中的某些 Promise 被 rejected,any() 也会返回一个 Promise,该 Promise 对于任何第一个 fulfilled 的 Promise 都会 fulfilled。

输入参数图

下图显示了 Promise.any() 方法的一个 Promise 被 rejected,而其他 Promise 被 fulfilled 的操作。

JavaScript Promise.any() Method
  • Promise1 在时间点 1 处因错误而被 rejected。
  • Promise2 在 t2 时被 fulfilled,解析为值 v2。
  • Promise.any() 方法返回一个解析为值 v2(promise2 的结果)的 Promise。

请注意,Promise.any() 方法会忽略被拒绝的 Promise (promise1)。

  • any() 返回一个 Promise,该 Promise 因 AggregateError(包含所有 rejection 原因)而被 rejected。
  • 如果可迭代对象中的所有 Promise 都被 rejected,或者 IEnumerable 对象为空。AggregateError 是 Error 的一个子类型。

输入参数图

下图显示了所有 Promise 都 rejected 的 Promise.any() 方法的操作。

JavaScript Promise.any() Method

在时间 t1,promise1 因错误 error1 而被 rejected。

在时间 t2,Promise2 因错误 error2 而被 rejected。

Promise.any() 方法返回的 AggregateError 包含所有被 rejected 的 Promise 的 error1 和 error2,以及一个在时间 t2 被 rejected 的 Promise。

JavaScript Promise.any() 方法的示例

下面的示例展示了带有所有输入 Promise 的 Promise.any()。我们可以让所有 Promise fulfilled,rejected,或者 mixed(混合)。

示例 1

JavaScript 的 Promise.any() 方法的基本用法,用于处理结果和值,并带有输入参数。使用该方法,我们可以获取 undefined 的值和结果状态以及时间。

输出

这张图片显示了 promise.any() 方法的所有 resolved 值。

JavaScript Promise.any() Method

示例 2

该示例展示了 Promise 中一个被 rejected 和一个被 resolved 的情况,使用了 promise 方法。这里我们使用多个 Promise 并设置操作的时间。

输出

这张图片显示了 promise.any() 方法的一个 rejected 和一个 resolved 值。

JavaScript Promise.any() Method

示例 3

该示例展示了 Promise 中所有 Promise 都被 rejected 的情况,使用了 promise 方法。这里我们使用多个 Promise 并设置功能所需的时间。

输出

这张图片显示了 promise.any() 方法的所有 rejected 值。

JavaScript Promise.any() Method

示例 4

promise.any() 方法使用 then、catch 和 finally 来 fulfilled 操作并显示输出。我们可以将所有这些方法与 promise.any() 的空可迭代值一起使用。finally 函数会调用输入信息并将其显示为输出。

输出

控制台选项卡显示了带有聚合信息的输出。

JavaScript Promise.any() Method

何时在 JavaScript 中使用 Promise.any() 方法

使用 Promise.any() 方法来提供第一个 fulfilled 的 Promise。Promise.any() 函数不会等到所有 Promise 都 fulfilled。换句话说,当一个 Promise 被 fulfilled 时,Promise.any() 函数就会短路。

例如,您可能有一个资源由两个或多个提供内容的网络(CDN)使用。Promise.any() 方法可用于动态加载第一个可用的资源。

示例

以下示例使用 Promise.any() 方法检索两个图像,并显示第一个可用的图像。

输出

输出显示了一个 Promise 数据图像和一个 rejected 的图像。

JavaScript Promise.any() Method

它的工作原理

  • 首先,创建 getImageBlob() 函数,它使用 fetch API 从 URL 获取图像的 blob。getImageBlob() 方法返回的 Promise 对象会解析为图像 blob。
  • 接下来,创建两个 Promise 来获取图像。
  • 第三,使用 Promise.any() 方法来显示第一个可用的图像。

结论

使用 JavaScript Promise.any() 方法来确定列表中哪个 Promise 最先满足。