Signatur
Beschreibung
Die statische Methode Promise.allSettledKeyed() ist das objektbasierte Gegenstück zu Promise.allSettled(). Statt eines Arrays bzw. Iterables übergibst du ein Objekt, dessen Eigenschaftswerte Promises (oder beliebige Werte) sind. Das zurückgegebene Promise wird erfüllt, sobald alle Werte abgeschlossen sind – egal ob erfüllt oder abgelehnt.
Das Ergebnis ist ein Objekt mit denselben Schlüsseln wie die Eingabe. Jeder Wert ist ein Ergebnisobjekt: { status: "fulfilled", value } oder { status: "rejected", reason }. Damit entfällt das fehleranfällige Zuordnen über Array-Indizes, das bei Promise.allSettled([a, b, c]) mit anschließender Destrukturierung nötig ist – besonders praktisch, wenn viele unabhängige Anfragen parallel laufen und später einzeln ausgewertet werden sollen.
Typische Einsatzfälle sind Dashboards, die mehrere Datenquellen gleichzeitig laden und Teilfehler tolerieren, oder Konfigurationsladevorgänge, bei denen jeder Teil optional ist. Berücksichtigt werden die eigenen, aufzählbaren Eigenschaften des Eingabeobjekts; Werte, die keine Promises sind, werden wie bei Promise.resolve() behandelt.
Das Promise wird nie wegen eines abgelehnten Eingabe-Promises abgelehnt – nur, wenn die Eingabe selbst ungültig ist (z. B. kein Objekt), wird mit einem TypeError abgelehnt.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $promises Pflicht | Object | Objekt, dessen eigene aufzählbare Eigenschaften Promises, Thenables oder normale Werte enthalten. Die Schlüssel werden ins Ergebnis übernommen. |
Rückgabewert
{ status: "fulfilled", value } bzw. { status: "rejected", reason } enthält. Ist die Eingabe kein Objekt, wird das Promise mit einem TypeError abgelehnt.Beispiele
Grundlegende Nutzung mit gemischten Ergebnissen
const results = await Promise.allSettledKeyed({
user: Promise.resolve({ name: 'Anna' }),
settings: Promise.reject(new Error('Nicht gefunden')),
version: 3 // normaler Wert wird wie Promise.resolve(3) behandelt
});
console.log(results.user);
console.log(results.settings.status, results.settings.reason.message);
console.log(results.version);
Dashboard: mehrere APIs parallel laden, Teilfehler tolerieren
const loadJson = async (url) => {
const res = await fetch(url);
if (!res.ok) throw new Error(`HTTP ${res.status} bei ${url}`);
return res.json();
};
const loadDashboard = async () => {
const results = await Promise.allSettledKeyed({
news: loadJson('/api/news'),
weather: loadJson('/api/weather'),
stocks: loadJson('/api/stocks')
});
const data = {};
for (const [key, result] of Object.entries(results)) {
if (result.status === 'fulfilled') {
data[key] = result.value;
} else {
console.warn(`Widget "${key}" nicht verfügbar:`, result.reason.message);
data[key] = null;
}
}
return data;
};
loadDashboard().then(console.log);
Feature-Erkennung mit Fallback über Promise.allSettled()
const allSettledKeyed = Promise.allSettledKeyed
? (obj) => Promise.allSettledKeyed(obj)
: async (obj) => {
const keys = Object.keys(obj);
const settled = await Promise.allSettled(keys.map((k) => obj[k]));
const out = Object.create(null);
keys.forEach((k, i) => { out[k] = settled[i]; });
return out;
};
const sleep = (ms, value) => new Promise((r) => setTimeout(r, ms, value));
const res = await allSettledKeyed({
fast: sleep(10, 'schnell'),
slow: sleep(50, 'langsam')
});
console.log(res.fast.value, res.slow.value);
// Wichtig · Fallstricke
- Kompatibilität:
Promise.allSettledKeyed()stammt aus dem TC39-Vorschlag „Await Dictionary“ (zusammen mitPromise.allKeyed()) und ist noch nicht in allen Browsern bzw. Node.js verfügbar. Prüfe pertypeof Promise.allSettledKeyed === 'function'und nutze einen Fallback oder ein Polyfill (z. B. core-js). - Nur eigene, aufzählbare Eigenschaften: Geerbte Eigenschaften aus der Prototypkette werden ignoriert. Übergib also ein einfaches Objektliteral statt z. B. einer Klasseninstanz mit Gettern auf dem Prototyp.
- Ergebnis ohne Prototyp: Das Ergebnisobjekt hat keinen Prototyp, Methoden wie
results.hasOwnProperty()fehlen deshalb. Nutze stattdessenObject.hasOwn(results, key). - Keine Map als Eingabe: Eine
Mapwird nicht nach ihren Einträgen ausgewertet – wandle sie bei Bedarf mitObject.fromEntries(map)um. - Kein Abbruch: Wie bei
Promise.allSettled()laufen alle Promises bis zum Ende. Willst du beim ersten Fehler abbrechen, nimmPromise.allKeyed(); zum echten Abbrechen der Anfragen brauchst du zusätzlich einenAbortController. - Prüfe immer
status, bevor du aufvaluezugreifst – bei abgelehnten Einträgen gibt es nurreason.