JavaScript führt Code nacheinander in einem einzigen Ablauf aus. Aufgaben, die dauern (Netzwerk, Timer, Dateien), blockieren diesen Ablauf nicht: Du gibst an, was danach passieren soll, und das Programm macht in der Zwischenzeit weiter.
Timer und Callbacks
Ein Callback ist eine Funktion, die später aufgerufen wird:
Ergebnis
1: Start 2: Ende des Skripts 2b: nach 0 ms (trotzdem später!) 3: nach 100 ms
Selbst bei 0 ms läuft der Callback erst, nachdem der aktuelle Code fertig ist.
Callback-Hölle
Mehrere abhängige Schritte mit Callbacks werden schnell unleserlich:
Ergebnis
A B C fertig
Promises
Ein Promise ist ein Versprechen auf ein späteres Ergebnis. Es hat drei Zustände:
| Zustand | Bedeutung |
|---|---|
| pending | läuft noch |
| fulfilled | erfolgreich, mit einem Wert |
| rejected | fehlgeschlagen, mit einem Fehler |
Ergebnis
Fehler: kein Wert erhalten: Hallo verkettet: HALLO aufgeräumt
resolve(wert)meldet Erfolg,reject(fehler)meldet Misserfolg.then()verarbeitet das Ergebnis und liefert wieder ein Promise (daher verkettbar).catch()fängt Fehler aus allen Schritten davor.finally()läuft immer
Mehrere Promises kombinieren
Ergebnis
allSettled: [ 'fulfilled', 'rejected' ] race: schnell any: klappt all: [ 'a', 'b', 'c' ]
| Methode | Ergebnis |
|---|---|
Promise.all([...]) | alle erfolgreich → Array; bricht beim ersten Fehler ab |
Promise.allSettled([...]) | wartet auf alle, egal ob Erfolg oder Fehler |
Promise.race([...]) | das erste fertige (Erfolg oder Fehler) |
Promise.any([...]) | das erste erfolgreiche |
Fertige Promises
Ergebnis
synchron zuerst 42 nein Microtask
Promises und die Reihenfolge
Promise-Callbacks laufen als Microtasks, noch vor Timer-Callbacks (Macrotasks), aber nach dem aktuellen Code:
setTimeout(() => console.log("Timer"), 0);
Promise.resolve().then(() => console.log("Promise"));
console.log("synchron");synchron Promise Timer
Callback-APIs in Promises verpacken
const { promisify } = require("node:util");
const fs = require("node:fs");
// Alte Callback-Funktion in ein Promise verwandeln
const lesen = promisify(fs.readFile);
lesen(__filename, "utf8").then(t => console.log("gelesen:", t.length > 0));gelesen: true
Merke
- Lange Aufgaben blockieren nicht: Ergebnisse kommen später per Callback oder Promise
- Ein Promise ist pending, fulfilled oder rejected
.then()verkettet,.catch()fängt Fehler,.finally()räumt aufPromise.all,allSettled,race,anykombinieren mehrere Promises- Promise-Callbacks (Microtasks) laufen vor Timern
Aufgabe
Baue eine Funktion warte(ms), die ein Promise zurückgibt, und führe drei Wartezeiten einmal nacheinander und einmal parallel mit Promise.all aus.