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 statische Methode Promise.any() nimmt ein iterierbares Objekt von Promises als Eingabe und gibt ein einzelnes Promise zurück. Dieses zurückgegebene Promise wird erfüllt, wenn eines der Promises in der Eingabe erfüllt wird, mit dem Erfüllungswert dieses ersten erfüllten Promises. Es wird abgelehnt, wenn alle Promises in der Eingabe 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(new Error("error"));
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 das übergebene iterable leer ist.
  • Asynchron erfüllt wird, wenn eines der Promises im angegebenen iterable erfüllt wird. Der Erfüllungswert ist der Erfüllungswert des ersten erfüllten Promises.
  • Asynchron abgelehnt wird, wenn alle Promises im angegebenen iterable abgelehnt werden. Der Ablehnungsgrund ist ein AggregateError, der ein Array von Ablehnungsgründen in seiner errors-Eigenschaft enthält. Die Fehler sind in der Reihenfolge der übergebenen Promises, unabhängig von der Abschlussreihenfolge. Wenn das übergebene iterable nicht leer ist, aber keine ausstehenden Promises enthält, wird das zurückgegebene Promise dennoch asynchron (statt synchron) abgelehnt.

Beschreibung

Die Methode Promise.any() ist eine der Promise-Konkurrenzmethoden. Diese Methode ist nützlich, um das erste erfüllte Promise zurückzugeben. Sie reduziert die Wartezeit, nachdem ein Promise erfüllt wird, sodass sie nicht auf den Abschluss der anderen Promises wartet, sobald eines gefunden wird.

Im Gegensatz zu Promise.all(), das ein Array von Erfüllungswerten zurückgibt, erhalten wir nur einen Erfüllungswert (vorausgesetzt, zumindest ein Promise wird erfüllt). Dies kann vorteilhaft sein, wenn wir nur ein erfülltes Promise benötigen, aber nicht darauf achten, welches es ist. Beachten Sie einen weiteren Unterschied: Diese Methode wird bei einem leeren iterierbaren Objekt abgelehnt, da das iterable Objekt tatsächlich keine Elemente enthält, die erfüllt werden. Sie können Promise.any() und Promise.all() mit Array.prototype.some() und Array.prototype.every() vergleichen.

Auch im Gegensatz zu Promise.race(), das den ersten beendeten Wert (entweder Erfüllung oder Ablehnung) zurückgibt, liefert diese Methode den ersten erfüllten Wert. Diese Methode ignoriert alle abgelehnten Promises bis zu dem ersten Promise, das erfüllt wird.

Beispiele

Verwendung von Promise.any()

Promise.any() wird mit dem ersten zu erfüllenden Promise erfüllt, auch wenn ein Promise zuerst abgelehnt wird. Dies steht im Gegensatz zu Promise.race(), das mit dem ersten beendeten Promise erfüllt oder abgelehnt wird.

js
const pErr = new Promise((resolve, reject) => {
  reject(new Error("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() wird mit einem AggregateError abgelehnt, wenn kein Promise erfüllt wird.

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

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

Anzeige des ersten geladenen Bildes

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

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® 2026 Language Specification
# sec-promise.any

Browser-Kompatibilität

Siehe auch