Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.

View in English Always switch to English

Promise.any()

Baseline
Weitgehend verfügbar

Diese Funktion ist gut etabliert und funktioniert auf vielen Geräten und in vielen Browserversionen. Sie ist seit September 2020 browserübergreifend verfügbar.

Die statische Methode Promise.any() akzeptiert ein iterierbares Objekt von Promises als Eingabe und gibt ein einzelnes Promise zurück. Dieses zurückgegebene Promise erfüllt sich, wenn eines der Eingabe-Promises erfüllt wird, mit diesem ersten Erfüllungswert. Es wird abgelehnt, wenn alle Eingabe-Promises 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. Diese Werte werden abgewartet, daher werden auch andere thenables aufgelöst, während nicht-thenable Werte unverändert zurückgegeben werden.

Rückgabewert

Ein Promise, das:

  • Bereits abgelehnt ist, wenn das übergebene iterable leer ist.
  • Asynchron erfüllt wird, wenn eines der Promises im gegebenen iterable erfüllt wird. Der Erfüllungswert ist der Erfüllungswert des ersten Promises, das erfüllt wurde.
  • Asynchron abgelehnt wird, wenn alle Promises im gegebenen iterable abgelehnt werden. Der Ablehnungsgrund ist ein AggregateError, der in seiner errors-Eigenschaft ein Array von Ablehnungsgründen 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 anstehenden Promises enthält, wird das zurückgegebene Promise dennoch asynchron (anstatt synchron) abgelehnt.

Beschreibung

Die Methode Promise.any() ist eine der Promise-Konkurrenz-Methoden. Diese Methode ist nützlich, um das erste Promise zurückzugeben, das erfüllt wird. Sie bricht ab, nachdem ein Promise erfüllt wird, sodass sie nicht auf die Fertigstellung der anderen Promises wartet, sobald eines gefunden ist.

Im Gegensatz zu Promise.all(), das ein Array von Erfüllungswerten zurückgibt, erhalten wir nur einen Erfüllungswert (vorausgesetzt, mindestens ein Promise wird erfüllt). Dies kann von Vorteil sein, wenn wir nur ein erfülltes Promise benötigen, ohne dass es darauf ankommt, welches. Beachten Sie einen weiteren Unterschied: Diese Methode lehnt bei einem leeren iterierbaren Objekt ab, da tatsächlich keine Elemente im iterierbaren Objekt enthalten sind, 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 abgeschlossenen Wert (Erfüllung oder Ablehnung) zurückgibt, gibt diese Methode den ersten erfüllten Wert zurück. Diese Methode ignoriert alle abgelehnten Promises bis zum ersten erfüllten Promise.

Wie andere Promise-Kombinatoren markiert Promise.any() sofort alle Promises als "behandelt", wenn es aufgerufen wird (indem es ihre .then()-Methoden aufruft). Nachfolgende Ablehnungen nach der ersten Erfüllung werden ignoriert und lösen keine unhandledrejection-Ereignisse aus.

Das Erfüllen des zurückgegebenen Promises beendet nicht die verbleibenden Operationen oder entfernt die an deren Promises angehängten Handler. Wenn wiederholt ein langlebiges anstehendes Promise an Promise.any() übergeben wird, können sich selbst dann Handler auf diesem Promise ansammeln, wenn bei jeder Eingabe ein anderes erfüllt wird.

Beispiele

Verwendung von Promise.any()

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

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() lehnt mit einem AggregateError ab, 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

Die erste geladene Grafik anzeigen

In diesem Beispiel haben wir eine Funktion, die ein Bild abruft und ein 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

Spezifikation
ECMAScript® 2027 Language Specification
# sec-promise.any

Browser-Kompatibilität

Siehe auch