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 entgegen und gibt ein einzelnes Promise
zurück. Diese zurückgegebene Promise wird erfüllt, wenn eine der Eingabe-Promises erfüllt wird, mit diesem ersten Erfüllungswert. Sie 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(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
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 eine der Promises im gegebenen
iterable
erfüllt wird. Der Erfüllungswert ist der Erfüllungswert der ersten Promise, die erfüllt wurde. - Asynchron abgelehnt wird, wenn alle Promises im gegebenen
iterable
abgelehnt werden. Der Ablehnungsgrund ist einAggregateError
, das ein Array von Ablehnungsgründen in seinererrors
-Eigenschaft enthält. Die Fehler sind in der Reihenfolge der übergebenen Promises, ungeachtet der Abschlussreihenfolge. Wenn das übergebeneiterable
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 die erste erfüllte Promise zurückzugeben. Sie bricht ab, nachdem eine Promise erfüllt ist, sodass sie nicht auf die Fertigstellung der anderen Promises wartet, sobald eine erfüllt wurde.
Im Gegensatz zu Promise.all()
, das ein Array von Erfüllungswerten zurückgibt, erhalten wir nur einen Erfüllungswert (vorausgesetzt, mindestens eine Promise wird erfüllt). Dies kann vorteilhaft sein, wenn wir nur eine erfüllte Promise benötigen, aber es uns egal ist, welche es ist. Beachten Sie einen weiteren Unterschied: Diese Methode lehnt beim Erhalt eines leeren iterierbaren Objekts ab, da das iterierbare Objekt wahrheitsgemäß keine zu erfüllenden Elemente enthält. 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 erledigten 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 die erste Promise erfüllt wird.
Beispiele
Verwendung von Promise.any()
Promise.any()
erfüllt sich mit der ersten erfüllten Promise, auch wenn eine Promise zuerst abgelehnt wird. Dies steht im Gegensatz zu Promise.race()
, das mit der ersten erledigten Promise erfüllt oder abgelehnt wird.
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()
wird mit einem AggregateError
abgelehnt, wenn keine Promise erfüllt wird.
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 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).
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 |