Promise.any()

基线 广泛可用

此功能已得到良好确立,并且可在许多设备和浏览器版本中使用。它自以下日期起在所有浏览器中均可用 2020 年 9 月.

Promise.any() 静态方法接受一个 promise 可迭代对象作为输入,并返回单个Promise。此返回的 promise 在输入的任何 promise fulfilled 时 fulfilled,并使用此第一个 fulfilled 值。当所有输入的 promise 都 rejected 时,它会 rejected(包括传递空可迭代对象时),并使用一个包含 rejection 原因数组的AggregateError

试一试

语法

js
Promise.any(iterable)

参数

iterable

一个可迭代对象(例如Array)的 promise。

返回值

一个Promise,它

  • 已 rejected,如果传递的iterable为空。
  • 异步 fulfilled,当给定iterable中的任何 promise fulfilled 时。fulfilled 值是第一个 fulfilled 的 promise 的 fulfilled 值。
  • 异步 rejected,当给定iterable中的所有 promise 都 rejected 时。rejection 原因是一个AggregateError,在其errors属性中包含一个 rejection 原因数组。错误按传递的 promise 的顺序排列,而不管完成顺序如何。如果传递的iterable非空但包含任何挂起的 promise,则返回的 promise 仍然是异步(而不是同步)rejected。

描述

Promise.any() 方法是promise 并发方法之一。此方法对于返回第一个 fulfilled 的 promise 很有用。它在 promise fulfilled 后短路,因此一旦找到一个 promise,它就不会等待其他 promise 完成。

Promise.all()不同,后者返回fulfilled 值的数组,我们只会得到一个 fulfilled 值(假设至少有一个 promise fulfilled)。如果我们只需要一个 promise fulfilled,但我们不在乎哪一个,这将非常有用。请注意另一个区别:此方法在收到空可迭代对象时会 rejected,因为实际上,可迭代对象不包含任何 fulfilled 的项。您可以将Promise.any()Promise.all()Array.prototype.some()Array.prototype.every()进行比较。

此外,与Promise.race()不同,后者返回第一个settled值(fulfilled 或 rejected),此方法返回第一个fulfilled值。此方法会忽略所有 rejected 的 promise,直到第一个 fulfilled 的 promise 为止。

示例

使用 Promise.any()

Promise.any() 使用第一个 fulfilled 的 promise fulfilled,即使 promise 先 rejected 也是如此。这与Promise.race()形成对比,后者使用第一个 settled 的 promise fulfilled 或 rejected。

js
const pErr = new Promise((resolve, reject) => {
  reject("Always fails");
});

const pSlow = new Promise((resolve, reject) => {
  setTimeout(resolve, 500, "Done eventually");
});

const pFast = new Promise((resolve, reject) => {
  setTimeout(resolve, 100, "Done quick");
});

Promise.any([pErr, pSlow, pFast]).then((value) => {
  console.log(value);
  // pFast fulfills first
});
// Logs:
// Done quick

使用 AggregateError 进行 rejection

如果没有任何 promise fulfilled,则Promise.any()使用AggregateError rejected。

js
const failure = new Promise((resolve, reject) => {
  reject("Always fails");
});

Promise.any([failure]).catch((err) => {
  console.log(err);
});
// AggregateError: No Promise in Promise.any was resolved

显示第一个加载的图像

在此示例中,我们有一个函数可以获取图像并返回 blob。我们使用Promise.any()来获取几个图像并显示第一个可用的图像(即其 promise 已 resolved 的图像)。

js
async function fetchAndDecode(url, description) {
  const res = await fetch(url);
  if (!res.ok) {
    throw new Error(`HTTP error! status: ${res.status}`);
  }
  const data = await res.blob();
  return [data, description];
}

const coffee = fetchAndDecode("coffee.jpg", "Coffee");
const tea = fetchAndDecode("tea.jpg", "Tea");

Promise.any([coffee, tea])
  .then(([blob, description]) => {
    const objectURL = URL.createObjectURL(blob);
    const image = document.createElement("img");
    image.src = objectURL;
    image.alt = description;
    document.body.appendChild(image);
  })
  .catch((e) => {
    console.error(e);
  });

规范

规范
ECMAScript 语言规范
# sec-promise.any

浏览器兼容性

BCD 表格仅在启用 JavaScript 的浏览器中加载。

另请参阅