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 Promise.any() statische Methode nimmt ein iterierbares Objekt von Promises als Eingabe und gibt ein einzelnes Promise zurück. Dieses zurückgegebene Promise erfüllt sich, wenn eines der Eingaben-Promises erfüllt wird und zwar mit dem ersten Erfüllungswert. Es wird abgelehnt, wenn alle Eingaben-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
Promise.any(iterable)
Parameter
iterable-
Ein iterierbares Objekt (wie ein
Array) von Promises. Diese Werte werden awaited, sodass andere thenables ebenfalls aufgelöst werden, während Nicht-thenables unverändert zurückgegeben werden.
Rückgabewert
Ein Promise, das:
- Bereits abgelehnt ist, wenn das übergebene
iterableleer ist. - Asynchron erfüllt wird, wenn eines der Promises im angegebenen
iterableerfüllt wird. Der Erfüllungswert ist der Erfüllungswert des ersten Promise, das erfüllt wurde. - Asynchron abgelehnt wird, wenn alle Promises im angegebenen
iterableabgelehnt werden. Der Ablehnungsgrund ist einAggregateError, der ein Array von Ablehnungsgründen in seinererrors-Eigenschaft enthält. Die Fehler sind in der Reihenfolge der übergebenen Promises, unabhängig von der Abschlussreihenfolge. Wenn das übergebeneiterablenicht leer ist, aber keine schwebenden Promises enthält, wird das zurückgegebene Promise dennoch asynchron (statt synchron) abgelehnt.
Beschreibung
Die Promise.any() Methode ist eine der Promise-Konkurrenzmethoden. Diese Methode ist nützlich, um das erste zu erfüllende Promise zurückzugeben. Sie bricht ab, nachdem ein Promise erfüllt wurde, sodass es nicht auf den Abschluss der anderen Promises wartet, sobald eines gefunden wurde.
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 vorteilhaft sein, wenn wir nur möchten, dass ein Promise erfüllt wird, aber es uns gleich ist, welches es ist. Beachten Sie einen weiteren Unterschied: Diese Methode lehnt bei einem leeren iterierbaren Objekt ab, da im Grunde genommen das iterierbare Objekt keine Erfüllungen 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 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 Promise erfüllt wird.
Wie andere Promise-Kombinatoren markiert Promise.any() sofort alle Promises als "behandelt", wenn es aufgerufen wird (durch das Aufrufen ihrer .then() Methoden). Nachfolgende Ablehnungen nach der ersten Erfüllung werden ignoriert und lösen keine unhandledrejection Ereignisse aus.
Beispiele
>Verwendung von Promise.any()
Promise.any() erfüllt sich mit dem ersten erfüllten Promise, auch wenn ein Promise zuerst abgelehnt wird. Dies steht im Gegensatz zu Promise.race(), das sich bei dem ersten abgewickelten Promise erfüllt oder ablehnt.
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.
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
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 ein paar Bilder abzurufen und das erste verfügbare anzuzeigen (d.h. dessen Promise aufgelöst ist).
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> |