Promise.all in JavaScript – mehrere Requests parallel statt nacheinander
Drei await-Zeilen hintereinander warten unnötig lang – jede Anfrage blockiert die nächste. Mit Promise.all laufen sie gleichzeitig und du wartest nur so lange wie auf die langsamste. Inklusive der robusteren Variante allSettled.
Ein häufiger Performance-Fehler: mehrere await untereinander, obwohl die Anfragen gar nicht voneinander abhängen. Dann wartet jede auf die vorige – die Zeiten addieren sich.
Das langsame Muster
const user = await fetch("/api/user").then(r => r.json()); // 200 ms
const posts = await fetch("/api/posts").then(r => r.json()); // + 200 ms
const tags = await fetch("/api/tags").then(r => r.json()); // + 200 ms
// gesamt ≈ 600 msParallel mit Promise.all
const [user, posts, tags] = await Promise.all([
fetch("/api/user").then(r => r.json()),
fetch("/api/posts").then(r => r.json()),
fetch("/api/tags").then(r => r.json()),
]);
// gesamt ≈ 200 ms – so lange wie der langsamste RequestAlle drei starten sofort, Promise.all wartet, bis alle fertig sind, und gibt die Ergebnisse in derselben Reihenfolge zurück wie die Eingabe. Aus 600 ms werden 200 ms – ohne eine Zeile mehr Logik.
Wichtig: einer scheitert, alle scheitern
Promise.all bricht ab, sobald ein Promise abgelehnt wird – die anderen Ergebnisse gehen dann verloren. Wenn du willst, dass Teilergebnisse ankommen, nimm Promise.allSettled:
const results = await Promise.allSettled([a(), b(), c()]);
results.forEach(r => {
if (r.status === "fulfilled") console.log(r.value);
else console.warn("fehlgeschlagen:", r.reason);
});allSettled wartet immer auf alle und sagt dir pro Eintrag, ob er fulfilled oder rejected war. Ideal, wenn ein einzelner Ausfall die restliche Seite nicht blockieren soll.
Nur echt voneinander abhängige Aufrufe gehören hintereinander – der Rest läuft parallel. So halte ich Ladezeiten kurz. Mehr Snippets auf code.bymw.de.
Quellen
Du brauchst mehr als ein Snippet?
Ich entwickle Android-Apps in Kotlin und moderne Websites für Selbstständige und kleine Unternehmen — von der ersten Idee bis zum Release.
Projekt anfragen →Verwandte Snippets
requestAnimationFrame – die Animationsschleife, die zum Bildschirm passt
setInterval(schritt, 16) läuft auf einem 144-Hz-Monitor anders als auf einem alten Handy – und im Hintergrundtab einfach weiter. requestAnimationFrame löst beides, wenn man die verstrichene Zeit mitrechnet statt Bilder zu zählen.
toSorted, toReversed und with: Arrays sortieren, ohne das Original zu zerstören
array.sort() sortiert nicht eine Kopie, sondern das Array selbst – und genau daran ist schon mancher Zustand im Frontend stillschweigend kaputtgegangen. Seit ES2023 gibt es zu jeder dieser Methoden eine Variante, die eine Kopie zurückgibt.
Aufzählungen richtig verketten mit Intl.ListFormat
"a, b und c" von Hand zusammenzubauen geht fast immer schief – bei einem Element, bei zwei Elementen, beim letzten Komma. Intl.ListFormat macht es richtig, in jeder Sprache, ganz ohne Bibliothek.