Start · Sprachen · JavaScript · Referenz · Promise.allSettledKeyed()

Promise.allSettledKeyed()

Methode

Wartet, bis alle Promises in einem Objekt abgeschlossen sind, und liefert ein Objekt mit denselben Schlüsseln und je einem Ergebnisobjekt <code>{status, value | reason}</code>.

seit JavaScript TC39-Proposal „Await Dictionary“ (noch nicht Basel Kategorie: method-property

Signatur

Promise.allSettledKeyed(promises)

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

Typ
Promise<Object>
Beschreibung
Ein Promise, das mit einem Objekt (ohne Prototyp) erfüllt wird, das für jeden Eingabeschlüssel ein Ergebnisobjekt { 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);
{ status: 'fulfilled', value: { name: 'Anna' } } rejected Nicht gefunden { status: 'fulfilled', value: 3 }

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);
schnell langsam

// Wichtig · Fallstricke

  • Kompatibilität: Promise.allSettledKeyed() stammt aus dem TC39-Vorschlag „Await Dictionary“ (zusammen mit Promise.allKeyed()) und ist noch nicht in allen Browsern bzw. Node.js verfügbar. Prüfe per typeof 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 stattdessen Object.hasOwn(results, key).
  • Keine Map als Eingabe: Eine Map wird nicht nach ihren Einträgen ausgewertet – wandle sie bei Bedarf mit Object.fromEntries(map) um.
  • Kein Abbruch: Wie bei Promise.allSettled() laufen alle Promises bis zum Ende. Willst du beim ersten Fehler abbrechen, nimm Promise.allKeyed(); zum echten Abbrechen der Anfragen brauchst du zusätzlich einen AbortController.
  • Prüfe immer status, bevor du auf value zugreifst – bei abgelehnten Einträgen gibt es nur reason.