JavaScript/Objekte/Promise/allSettledKeyed

Aus SELFHTML-Wiki
Wechseln zu: Navigation, Suche

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 promises festgelegt sind. Sein Wert ist ein Objekt, das zu jedem berücksichtigten Schlüssel aus promises eine Eigenschaft mit gleichem Schlüssel enthält. Darin findet sich ein Objekt, das wie bei Promise.allSettled den Erfolg des entsprechenden Promise aus promises enthä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.

Paralleles Holen mehrerer Dateien
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!

Polyfill für allKeyed
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