6. Juli 2022

So funktioniert der Event Loop in JavaScript

JavaScript ist single-threaded: Es führt zu jedem Zeitpunkt nur eine Operation aus. Alle Anfragen laufen über einen einzigen Thread, Ein- und Ausgaben werden jedoch an andere Threads übergeben, damit das Programm nicht hängen bleibt. Die Kommunikation mit diesen Threads läuft über externe Schnittstellen, die solche Threads erzeugen können. Eine Webseite läuft also in einem Thread und kann trotzdem andere Threads nutzen, die bestimmte Aufgaben für sie erledigen. 

Sehen wir uns an, aus welchen Bausteinen der Event Loop besteht: 

Was sind Stack und Queue?

Ein Stack (Stapel) ist eine Datenstruktur, in der das zuletzt Hinzugefügte als Erstes ausgeführt wird. 

Queue (Warteschlange) – was zuerst ankommt, wird zuerst ausgeführt. 

Web APIs – zusätzliche Schnittstellen, die der Browser bereitstellt. Sie laufen in eigenen Browser-Threads. Dazu gehören Methoden für Timer (z. B. setTimeout), das Senden von XHR-Anfragen (Klasse XMLHttpRequest) sowie die Verarbeitung von Events aus dem DOM-Baum.

Hinter den Web APIs stehen weitere Datenstrukturen, die festlegen, was der Browser zuerst ausführt. Es gibt den Haupt-Thread und Neben-Threads, doch irgendwann muss entschieden werden, wann ein Ergebnis an den Haupt-Thread geht. Warten zwei Dinge gleichzeitig, wird genau hier entschieden, welches Vorrang hat. Datenstruktur Stack: Operationen push und pop

STACK | Quelle: https://www.programiz.com/dsa/stack

Datenstruktur Queue: Operationen enqueue und dequeue

QUEUE | Quelle: https://cdn.programiz.com/sites/tutorial2program/files/queue.png

Die Queues teilen sich in Makro-Tasks, Mikro-Tasks und eine Rendering-Queue. Sie enthalten Funktionsaufrufe, die als Callbacks an asynchrone Methoden der Web APIs übergeben wurden (setTimeout, setInterval, xhr, querySelector). Der Event Loop arbeitet Aufgaben ab, solange welche vorhanden sind: zuerst die Mikro-, dann die Makro-Tasks. Beim Rendering verarbeitet der Event Loop nur, was in der Queue steht. Kommt in dieser Zeit etwas Neues hinzu, muss es warten. 

Synchroner und asynchroner Code

Synchron: wird Zeile für Zeile ausgeführt. Es läuft immer nur ein Codeabschnitt. Ist er gestartet, geht nichts anderes, bis er fertig ist.

Asynchron: kann parallel zum Rest der Anwendung laufen, ohne sie zu stören, liefert das Ergebnis aber nicht sofort. Beispiel: eine API-Abfrage, während gleichzeitig eine Animation läuft.

Event Loop in JavaScript: Call Stack, Web APIs und Callback-Queue

 Quelle: https://kursjs.pl/kurs/intervals/event-loop.php#sync-vs-async

Die Grafik zeigt die drei Hauptelemente des Event Loops. Der Event Loop selbst ist die Warteschlange der aufzurufenden Befehle. Ob synchron oder asynchron, spielt keine Rolle – es sind Aktionen des Nutzers, die verarbeitet werden müssen. Sie warten in der Queue und werden der Reihe nach abgeholt, in der Reihenfolge ihres Eintreffens. Ein synchroner Befehl wird sofort ausgeführt, der Rest wartet. Bei einem asynchronen Befehl wird nur ein Verweis darauf gespeichert, die Ausführung selbst übernehmen die Web APIs. Der Event Loop kümmert sich nicht weiter darum – er meldet nur, dass es sich um asynchronen Code handelt, nach dem Motto „Erledige das für mich und gib mir nur das Ergebnis“. Dann holt er den nächsten Befehl aus der Queue. Was an die Web APIs abgegeben wurde, landet am Ende ebenfalls wieder in der Queue. So läuft alles ohne Unterbrechung, eben in einer „Schleife“. 

Was ist der Event Loop?

Der Event Loop legt fest, in welcher Reihenfolge Code ausgeführt wird. Er verbindet die synchrone und die asynchrone Welt. Was wir der Reihe nach erledigen, steht sofort zur Verfügung. Was wir delegieren, wollen wir später als Wert zurückbekommen. Beispiel: eine Serveranfrage nach Daten – es reicht nicht, dass die Daten abgerufen werden, wir wollen sie auch erhalten. Und weil der Code inzwischen weitergelaufen ist, braucht es einen Mechanismus, der diese Daten später abholt. 

 

Um den Event Loop mit all seinen Mechanismen zu verstehen, muss man zwei Begriffe unterscheiden: synchronen und asynchronen Code. Synchroner Code läuft Zeile für Zeile, hat keine Nebeneffekte und wird von A bis Z genau so ausgeführt, wie er aufgerufen wurde. Bei asynchronem Code wird ein Teil der Arbeit an bestimmten Stellen an einen eigenen Thread oder auf später verschoben. Beispiel: Wir wollen gleichzeitig eine Animation anzeigen und Daten vom Server laden. Mit synchronem Code müssten wir entweder auf die Daten warten oder die Animation zeigen. Mit asynchronem Code können sich beide Aufgaben abwechseln. Der Nutzer merkt davon nichts, denn den Ablauf steuert der Browser. 

Mehr über den Event Loop haben wir in den Q-Lab-Treffen der EMBIQ Community gelernt. 

 

 

Das könnte Sie auch interessieren:
Von Assistenten zu Agenten: So bauen wir heute Software
Software für IoT und smarte Lösungen (Juli 2023)
Warum wir über KI in Prozessen sprechen, nicht in Produkten

Angebot oder Beratung anfragen

Verantwortlich für die Verarbeitung Ihrer personenbezogenen Daten ist die EMBIQ sp. z o.o. (Lublin). Wir verarbeiten Ihre Angaben ausschließlich zur Beantwortung Ihrer Anfrage und speichern sie höchstens 24 Monate. Bei Fragen zu Ihren Daten erreichen Sie uns unter info@embiq.com.

Wir sehen uns Ihr Projektkonzept und seinen aktuellen Stand gemeinsam an.

Sie erhalten von uns einen ersten Vorschlag zum Projektumfang sowie eine Zeit- und Kostenschätzung.

Die Beratung ist durch eine Geheimhaltungsvereinbarung (NDA) geschützt.

EMBIQ sp. z o.o., Sitz: Lublin · Anschrift: al. Kraśnicka 27, 20-718 Lublin, Polen · Registergericht: Sąd Rejonowy Lublin-Wschód w Lublinie z siedzibą w Świdniku, VI Wydział Gospodarczy KRS · KRS 0000338852 · NIP 9462590420 · Stammkapital: 75.000,00 PLN