Promise.any()

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since September 2020.

Die Promise.any() statische Methode nimmt ein iterierbares Objekt von Promises als Eingabe und gibt ein einzelnes Promise zurück. Dieses Promise wird erfüllt, wenn eines der Eingabepromises erfüllt wird, mit dem Erfüllungswert des ersten erfüllten Promises. Es wird abgelehnt, wenn alle Eingabepromises abgelehnt werden (einschließlich, wenn ein leeres iterierbares Objekt übergeben wird), mit einem AggregateError, der ein Array von Ablehnungsgründen enthält.

Probieren Sie es aus

const promise1 = Promise.reject(0);
const promise2 = new Promise((resolve) => setTimeout(resolve, 100, "quick"));
const promise3 = new Promise((resolve) => setTimeout(resolve, 500, "slow"));

const promises = [promise1, promise2, promise3];

Promise.any(promises).then((value) => console.log(value));

// Expected output: "quick"

Syntax

js
Promise.any(iterable)

Parameter

iterable

Ein iterierbares Objekt (wie ein Array) von Promises.

Rückgabewert

Ein Promise, das:

  • Bereits abgelehnt ist, wenn ein leeres iterable übergeben wurde.
  • Asynchron erfüllt wird, wenn eines der Promises im übergebenen iterable erfüllt wird. Der Erfüllungswert ist der Erfüllungswert des ersten erfüllten Promises.
  • Asynchron abgelehnt wird, wenn alle Promises im übergebenen iterable abgelehnt werden. Der Ablehnungsgrund ist ein AggregateError, der ein Array von Ablehnungsgründen in seiner errors-Eigenschaft enthält. Die Fehler befinden sich in der Reihenfolge der übergebenen Promises, unabhängig von ihrer Abschlussreihenfolge. Wenn das übergebene iterable nicht leer ist, aber keine ausstehenden Promises enthält, wird das zurückgegebene Promise trotzdem asynchron (statt synchron) abgelehnt.

Beschreibung

Die Methode Promise.any() ist eine der Promise-Konkurrenzmethoden. Diese Methode ist nützlich, um das erste Promise, das erfüllt wird, zurückzugeben. Sie bricht ab, nachdem ein Promise erfüllt wurde, und wartet somit nicht auf den Abschluss der anderen Promises, sobald eines gefunden wurde.

Im Gegensatz zu Promise.all(), das ein Array von Erfüllungswerten zurückgibt, erhalten wir hier nur einen Erfüllungswert (unter der Annahme, dass mindestens ein Promise erfüllt wird). Dies kann vorteilhaft sein, wenn wir nur ein erfülltes Promise benötigen, unabhängig davon, welches es ist. Beachten Sie einen weiteren Unterschied: Diese Methode lehnt ab, wenn ein leeres iterierbares Objekt übergeben wird, da das Objekt tatsächlich keine Elemente enthält, die erfüllt werden können. Sie können Promise.any() und Promise.all() mit Array.prototype.some() und Array.prototype.every() vergleichen.

Ebenfalls im Unterschied zu Promise.race(), das den ersten abgewickelten Wert (entweder Erfüllung oder Ablehnung) zurückgibt, gibt diese Methode den ersten erfüllten Wert zurück. Diese Methode ignoriert alle abgelehnten Promises, bis das erste erfüllte Promise gefunden wird.

Beispiele

Verwendung von Promise.any()

Promise.any() wird mit dem ersten erfüllten Promise erfüllt, selbst wenn ein anderes Promise zuerst abgelehnt wird. Dies steht im Gegensatz zu Promise.race(), das sich mit dem zuerst abgeschlossenen Promise (Erfüllung oder Ablehnung) erfüllt oder ablehnt.

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

Ablehnungen mit AggregateError

Promise.any() lehnt mit einem AggregateError ab, wenn kein Promise erfüllt wird.

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

Anzeigen des ersten geladenen Bildes

In diesem Beispiel haben wir eine Funktion, die ein Bild abruft und einen Blob zurückgibt. Wir verwenden Promise.any(), um einige Bilder abzurufen und das erste verfügbare Bild (d.h. das Promise, das zuerst aufgelöst wurde) anzuzeigen.

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);
  });

Spezifikationen

Specification
ECMAScript® 2025 Language Specification
# sec-promise.any

Browser-Kompatibilität

Report problems with this compatibility data on GitHub
desktopmobileserver
Chrome
Edge
Firefox
Opera
Safari
Chrome Android
Firefox for Android
Opera Android
Safari on iOS
Samsung Internet
WebView Android
WebView on iOS
Deno
Node.js
any

Legend

Tip: you can click/tap on a cell for more information.

Full support
Full support

Siehe auch