JavaScript/Objekte/Promise/allKeyed
NEU ab September 2026
Die Methode Promise.allKeyed 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 von allKeyed zurückgegeben Promise zurückgewiesen.
Der Vorteil von allKeyed gegenüber Promise.all ist, dass es nicht auf die Reihenfolge der Werte ankommt, sondern jeder Wert seinen eindeutigen Schlüssel besitzt, mit dem auf ihn zugegriffen werden kann.
Syntax
const promise = Promise.allKeyed( promises-object);
Parameter
-
promises - muss ein JavaScript-Objekt sein, dessen Eigenschaftswerte die zu konsolidierenden Werte sind. Es werden nur die eigenen aufzählbaren Eigenschaften betrachtet (diejenigen, die Object.entries() liefert).
Rückgabe
- Ein Promise-Objekt, dessen Wert im Erfolgsfall die konsolidierten Werte als Objekt enthält. Darin findet sich zu jedem berücksichtigten Schlüssel eine Eigenschaft mit gleichem Schlüssel, die den Ergebniswert des entsprechenden Promise aus
promisesenthält.
Eigenschaften
Hinweis: Jedes Promise ist auch ein Thenable!
Die Promise.allKeyed-Methode verarbeitet alle aufzählbaren eigenen Eigenschaften des übergebenen Objekts. 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 Ergebnisobjekt übernommen. Die Schlüssel der Werte im Ergebnisobjekt entsprechen dabei den Schlüsseln, wie sie im promises-object-Parameters angetroffen wurden.
Wenn der Aufrufparameter von allKeyed keine Werte enthält, wird das zurückgegeben Promise bereits als fulfilled zurückgegeben. Sein Wert ist ein Objekt ohne eigene Eigenschaften.
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 filePromises = {
star: promiseFile("star.png"),
arrow: promiseFile("arrow.png"),
check: promiseFile("checkmark.png"),
};
try {
const icons = await Promise.allKeyed( filePromises );
// icons.star enthält star.png
// icons.arrow enthält arrow.png
// icons.check enthält checkmark.png
}
catch(fehler) {
// Wenn ein fetch schiefging, haben wir hier das Error-Objekt dazu. Nur wissen wir nicht, welcher Fetch es war
};
Polyfill
Die Await Dictionary Spezifikation beschreibt einen ziemlich komplexen Ablauf für allKeyed. Wenn Du einen absolut korrekten Polyfill brauchst, empfehlen wir Dir core-js. Oder warte bis zur Baseline-Verfügbarkeit des Features.
Wir können aber einen einfachen Polyfill für eigene Experimente anbieten. Jegliche Verwendung ist bitte mit Selfhtml zu attributieren und erfolgt auf eigenes Risiko!
if (!Promise.allKeyed) {
// Vereinfachter allKeyed Polyfill von https://www.selfhtml.org,
// produktiver Einsatz auf eigene Gefahr!
Promise.allKeyed = function(obj) {
const keys = Object.keys(obj);
const result = { };
if (keys.length == 0) return Promise.resolve(result);
return Promise.all(Object.values(obj))
.then(allValues => {
allValues.map((val,i) => result[keys[i]] = val);
return result;
});
}
}
Siehe auch
- Promise.allSettledKeyed: Variante von
allKeyed, die auch den settled-Status der übergebenen Promises erfasst - Promise.all: Eine Concurrency-Methode, die die Ergebnisse als Array zurückgibt
- Promise.any: Eine Concurrency-Methode, die sich nur für das erste erfolgreiche Promise interessiert