JavaScript/Objekte/Promise/all
Die Methode Promise.all dient dazu, eine Anzahl gleichzeitig schwebender Promises in einem Promise zu konsolidieren. Außer Promises können auch Thenables und beliebige andere Werte übergeben werden, letztere werden unverändert ins Ergebnis übernommen.
Wenn alle beteiligten Promises bzw. Thenables erfüllt werden, ist auch das konsolidierte Promise erfüllt. Sobald eines davon zurückgewiesen wird, wird auch das all()-Promise zurückgewiesen.
Syntax
const promise = Promise.all( promises);
Parameter
-
promises - muss ein iterierbares Objekt sein (beispielsweise ein Array), das beim Durchlaufen die Werte liefert, die konsolidiert werden sollen.
Rückgabe
- Ein Promise, das im Erfolgsfall die konsolidierten Werte als Array enthält
Eigenschaften
Hinweis: Jedes Promise ist auch ein Thenable!
Die Promise.all-Methode durchläuft die übergebenen Werte mit Hilfe des Iterator-Protokolls. Wenn sie dabei auf ein Thenable-Objekt trifft, registriert sie die erforderlichen Callbacks, um das Ergebnis dieses Thenable zu übernehmen. Andere Werte werden unverändert ins Ergebnis übernommen.
Falls eins der gefundenen Thenables rejected ist oder später zurückgewiesen wird, wird dieser Reject-Grund übernommen und das von all zurückgegebene Promise damit zurückgewiesen. Dies geschieht beim ersten angetroffenen rejected-Thenable, die übrigen Werte werden verworfen.
Wenn hingegen alle gefundenen Thenables auf fulfilled gesetzt werden, werden ihre Werte ins Ergebnisarray übernommen. Die Anordnung der Werte im Ergebnisarray entspricht dabei der Reihenfolge, wie sie beim iterieren des promises-Parameters angetroffen wurden.
Wenn der Aufrufparameter von all keine Werte enthält, wird das zurückgegeben Promise bereits als fulfilled zurückgegeben. Sein Wert ist ein leeres Array.
Wenn Werte vorgefunden werden, ist das zurückgegeben Promise in jedem Fall zunächst pending. Die Festlegung auf fulfilled oder rejected erfolgt auf jeden Fall asynchron. Die Unterscheidung zwischen „sofort festgelegt“ und „asynchron festgelegt“ ist normalerweise nicht von Belang, kann aber darauf Einfluss haben, in welcher Reihenfolge Mikrotasks ausgeführt werden.
Ein Anwendungsfall ist das parallele Downloaden mehrerer Dateien. Nur dann, wenn alle Dateien erfolgreich geladen werden konnten, soll es weitergehen.
function promiseFile(name) {
return fetch(name)
.then(response => {
if (!response.ok)
throw new Error(`${response.url} failed, status=${response.status}`);
return response.text()));
});
}
const files = "a.dat", "b.dat", "c.dat";
const filePromises = files.map(promiseFile); // Ein Promise je File
Promise.all( filePromises )
.then(data => {
// data ist ein Array, data[0] enthält Inhalt von a.dat, data[1] enthält Inhalt von b.dat, etc
}
.catch(fehler => {
// Wenn ein fetch schiefging, haben wir hier das Error-Objekt dazu
});
Siehe auch
- Promise.allSettled: Variante von
all, die auch den settled-Status der übergebenen Promises erfasst - Promise.any: Eine Concurrency-Methode, die sich nur für das erste erfolgreiche Promise interessiert