Menu
CoddyTech

Der Event Loop

Teil des Abschnitts Node.js-Grundlagen der Node.js-Journey von Coddy. Lektion 26 von 33.

Callbacks und Promises werden später ausgeführt, und Fehler entstehen, wenn man nicht genau weiß, wann.

Node führt zuerst den gesamten synchronen Code bis zum Ende aus. Dann führt es Microtasks aus: Promise-Callbacks und Funktionen, die an queueMicrotask übergeben werden. Erst danach kommen Timer. setTimeout(fn, ms) führt fn einmal nach ms Millisekunden aus. Selbst setTimeout(fn, 0) wartet, bis die Microtasks erledigt sind.

setTimeout(() => console.log('C timer'), 0);
Promise.resolve().then(() => console.log('B promise'));
console.log('A sync');
// A sync, B promise, C timer

Eine Verzögerung von 0 bedeutet: so bald wie möglich nach den Microtasks, niemals davor. Timer werden in der Reihenfolge ihrer Verzögerung ausgelöst; bei gleichen Verzögerungen wird der zuerst gesetzte Timer zuerst ausgelöst.

challenge icon

Aufgabe

Einfach

Node führt deinen Code in einer festen Reihenfolge aus. Zuerst kommen die normalen Zeilen, dann Microtasks wie Promise-Callbacks und anschließend Timer. Nutze diese Reihenfolge, damit vier Zeilen in aufsteigender Zahlenreihenfolge ausgegeben werden, ohne sie zu verschieben.

order.js gibt seine vier Zeilen von 4 bis 1 aus. Verschiebe oder sortiere die Zeilen nicht um. Wickle stattdessen drei davon so ein, dass sie später ausgeführt werden.

  1. Lass console.log('1 sync') unverändert. Normaler Code wird zuerst ausgeführt.
  2. Wickle die Zeile 2 microtask in queueMicrotask, damit sie direkt nach dem normalen Code ausgeführt wird.
  3. Wickle die Zeile 3 timeout und die Zeile 4 timeout later jeweils in ein eigenes setTimeout. setTimeout(fn, ms) führt die Funktion fn einmal aus, und zwar ms Millisekunden später. Zeile 4 wird vor Zeile 3 festgelegt, daher benötigt sie die längere Verzögerung.

node order.js gibt dann Folgendes aus:

1 sync
2 microtask
3 timeout
4 timeout later

Probiere es aus: Rate die Reihenfolge, bevor du es ausführst. Drücke dann auf „Spielen“; im Terminal wird $ node order.js angezeigt. Gib anschließend beiden Timern eine Verzögerung von 0 und führe das Programm erneut aus: 4 timeout later wird nun vor 3 timeout ausgegeben, denn bei gleichen Verzögerungen wird der Timer, der zuerst festgelegt wurde, zuerst ausgeführt. Stelle die längere Verzögerung für Zeile 4 wieder her, bevor du auf „Prüfen“ drückst.

Probier es selbst

// Sorge dafür, dass diese Zeilen in der Reihenfolge ihrer Nummern ausgegeben werden, ohne sie zu verschieben.
// Umschließe sie stattdessen mit queueMicrotask und setTimeout.
console.log('4 timeout later');
console.log('3 timeout');
console.log('2 microtask');
console.log('1 sync');
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Node.js-Grundlagen

Übe selbstständig: Express-Playground