JavaScript/Objekte/Promise/allSettledKeyed
NEU ab September 2026
Die Methode Promise.allSettledKeyed 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.
Das von der Methode gelieferte Promise wartet darauf, dass alle beteiligten Promises bzw. Thenables festgelegt werden, fasst ihre Ergebnisse in einem Objekt zusammen und erfüllt das zurückgegebene Promise damit.
Der Vorteil von allSettledKeyed gegenüber Promise.allSettled ist, dass es nicht auf die Reihenfolge der Werte ankommt, sondern jedes Ergebnis seinen eindeutigen Schlüssel besitzt, mit dem darauf zugegriffen werden kann.
Syntax
const promise = Promise.allSettledKeyed( promises-object);
Parameter
-
promises - muss ein JavaScript-Objekt sein, dessen Eigenschaftswerte die zu konsolidierenden Thenables sind. Es werden nur die eigenen aufzählbaren Eigenschaften betrachtet (diejenigen, die Object.entries() liefert).
Rückgabe
- Ein Promise-Objekt, das sich erfüllt, sobald alle Promises in
promisesfestgelegt sind. Sein Wert ist ein Objekt, das zu jedem berücksichtigten Schlüssel auspromiseseine Eigenschaft mit gleichem Schlüssel enthält. Darin findet sich ein Objekt, das wie bei Promise.allSettled den Erfolg des entsprechenden Promise auspromisesenthält.
Eigenschaften
Hinweis: Jedes Promise ist auch ein Thenable!
Die Promise.allSettledKeyed-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. Die Ergebnisse werden unter dem gleichen Schlüssel im Ergebnisobjekt eingetragen, den sie im übergebenen Objekt haben.
Das Ergebnis für ein fulfilled-Promise ist ein Objekt der Form
{ status: "fulfilled", value: resolve-ergebnis }
Für ein rejected-Promise sieht das Objekt so aus
{ status: "rejected", reason: reject-ergebnis }
Andere Werte erhalten ein Objekt der Form
{ status: "fulfilled", value: wert }
Wenn der Aufrufparameter von allSettledKeyed keine aufzählbaren Eigenschaften enthält, wird das zurückgegeben Promise bereits als fulfilled zurückgegeben. Sein Wert ist ein Objekt ohne Eigenschaften.
Eigenschaften des Aufrufparameters, die geerbt oder nicht aufzählbar sind, finden sich im Ergebnisobjekt nicht wieder.
Ein Anwendungsfall ist das parallele Downloaden mehrerer Dateien, wenn bei einem unvollständigen Download zumindest der erfolgreiche Teil genutzt werden soll.
function promiseFile(name) {
return fetch(name)
.then(response => {
if (!response.ok)
throw new Error(`${response.url} failed, status=${response.status}`);
return response.blob()));
});
}
const filePromises = {
star: promiseFile("star.png"),
arrow: promiseFile("arrow.png"),
check: promiseFile("checknark.png"), // Tippfehler im Dateinamen!
};
const icons = await Promise.allSettledKeyed( filePromises );
// icons.star enthält { status: 'fulfilled', value: ''Blob mit Inhalt von star.png'' }
// icons.arrow enthält { status: 'fulfilled', value: ''Blob mit Inhalt von arrow.png'' }
// icons.check enthält { status: 'rejected', value: "checknark.png failed, status=404" }
// Ein Reject des Promise ist bei allSettledKeyed nicht vorgesehen.
Polyfill
Die Await Dictionary Spezifikation beschreibt einen ziemlich komplexen Ablauf für allSettledKeyed. 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.allSettledKeyed) {
// Vereinfachter allSettledKeyed Polyfill von https://www.selfhtml.org,
// produktiver Einsatz auf eigene Gefahr!
Promise.allSettledKeyed = function(obj) {
const keys = Object.keys(obj);
const result = { };
if (keys.length == 0) return Promise.resolve(result);
return Promise.allSettled(Object.values(obj))
.then(allValues => {
allValues.map((val,i) => result[keys[i]] = val);
return result;
});
}
}
Siehe auch
- Promise.allKeyed: Variante von
allSettledKeyed, die nur dann fulfilled wird, wenn keins der übergebenen Promises zurückgewiesen wird - Promise.allSettled: 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