Die Ereignisschleife ist ein entscheidender Mechanismus in Node.js, der asynchrone Rückrufe verwaltet und es der Plattform ermöglicht, nicht blockierende E/A-Vorgänge durchzuführen. Hier ist eine detaillierte Aufschlüsselung der 6 wichtigsten Punkte der Ereignisschleife.
- Anrufstapel
- Rückrufregistrierung
- Rückrufwarteschlangen
- Kontinuierliche Überwachung
- Abschluss der asynchronen Vorgänge
- Ausführungsablauf
1. Call Stack: Den Call Stack in JavaScript verstehen:
- Der Aufrufstapel ist der Ort, an dem JavaScript-Code ausgeführt wird. Wenn eine Funktion aufgerufen wird, wird sie auf den Aufrufstapel verschoben. Sobald die Funktionsausführung abgeschlossen ist, wird sie vom Stapel entfernt.
- Wenn der Aufrufstapel mit der Ausführung von Funktionen beschäftigt ist, wartet die Ereignisschleife, bis der Stapel leer ist, bevor sie die Rückrufwarteschlangen überprüft.
2. Rückrufregistrierung: Wie asynchrone Vorgänge gehandhabt werden:
- Web-APIs und Node.js-APIs: Wenn ein asynchroner Vorgang (wie ein Dateilesevorgang, eine Netzwerkanforderung oder ein Timer) initiiert wird, wird der entsprechende Rückruf bei einer Web-API (im Browser) oder einer Node.js-API registriert (im Server).
- Beispiel:
- Für setTimeout() erfolgt der Rückruf, wenn der Timer abläuft
Die Funktion wird bei der auszuführenden Ereignisschleife registriert
in der Makrotask-Warteschlange.
- Für eine Netzwerkanfrage über http.get(), wenn die Daten
Wird ein Anruf empfangen, wird der Rückruf in die Warteschlange gestellt
Verarbeitung.
3. Rückrufwarteschlangen: Makrotask vs. Mikrotask:
Node.js verwaltet zwei Haupttypen von Rückrufwarteschlangen
- Makrotask-Warteschlange (Aufgabenwarteschlange): Diese Warteschlange verarbeitet Rückrufe von Vorgängen wie setTimeout, setInterval, E/A-Vorgängen und anderen Aufgaben, die Zeit in Anspruch nehmen. Aufgaben in dieser Warteschlange werden erst ausgeführt, nachdem alle Mikrotasks verarbeitet wurden und der Aufrufstapel leer ist.
- Mikrotask-Warteschlange: Diese Warteschlange enthält Rückrufe von Promises und Process.nextTick(). Mikrotasks haben eine höhere Priorität und werden sofort ausgeführt, nachdem der Aufrufstapel leer ist, bevor Makrotasks verarbeitet werden.
4. Kontinuierliche Überwachung durch die Ereignisschleife:
- Die Ereignisschleife überprüft kontinuierlich den Aufrufstapel und die Rückrufwarteschlangen, um festzustellen, ob Aufgaben ausgeführt werden müssen. Dadurch kann Node.js mehrere asynchrone Vorgänge gleichzeitig verarbeiten, ohne den Hauptthread zu blockieren.
5. Abschluss asynchroner Vorgänge:
Sobald ein asynchroner Vorgang abgeschlossen ist, wird die entsprechende Rückruffunktion zur entsprechenden Warteschlange hinzugefügt:
- Wenn ein durch setTimeout() gesetzter Timer abläuft, wird der zugehörige Rückruf in der Makrotask-Warteschlange registriert und wartet darauf, ausgeführt zu werden, nachdem der aktuelle Stapel und alle Mikrotasks verarbeitet wurden.
6. Ausführungsablauf: Aufgaben zurück in den Aufrufstapel verschieben:
- Wenn der Aufrufstapel leer ist, verarbeitet die Ereignisschleife zunächst alle Aufgaben in der Mikrotask-Warteschlange. Dadurch wird sichergestellt, dass Versprechensauflösungen und andere Mikroaufgaben so schnell wie möglich erledigt werden.
- Nachdem alle Mikrotasks abgeschlossen sind, geht die Ereignisschleife weiter zur Makrotask-Warteschlange und führt jeweils eine Aufgabe aus. Diese Aufgabenausführung wird fortgesetzt, bis der Stapel wieder leer ist. An diesem Punkt überprüft die Schleife die Warteschlangen erneut.
- Sobald die Aufgabe ausgeführt ist, wird sie aus dem Aufrufstapel entfernt
Beispiele für die Ausführung einer Ereignisschleife:
console.log('Start');
setTimeout(() => {
console.log('Timeout');
}, 0);
Promise.resolve().then(() => {
console.log('Promise');
});
console.log('End');
Ausgabe:
Start
End
Promise
Timeout
In diesem Beispiel:
- Die synchronen Protokolle („Start“ und „Ende“) werden zuerst ausgeführt und dem Aufrufstapel hinzugefügt.
- Der setTimeout-Rückruf wird in der Makrotask-Warteschlange registriert.
- Das Versprechen wird aufgelöst und fügt seinen Rückruf zur Mikrotask-Warteschlange hinzu.
- Nachdem der Aufrufstapel gelöscht wurde, verarbeitet die Ereignisschleife die Mikrotask-Warteschlange („Promise“), bevor sie mit der Makrotask-Warteschlange („Timeout“) fortfährt.
Die Ereignisschleife ist eine Kernfunktion von Node.js, die eine effiziente Verwaltung asynchroner Vorgänge ermöglicht. Durch die kontinuierliche Überwachung des Aufrufstapels und der Rückrufwarteschlangen wird sichergestellt, dass Aufgaben nicht blockierend verarbeitet werden. Die Registrierung von Rückrufen in Web-APIs und Node.js-APIs ist der Schlüssel zur Aufrechterhaltung der Reaktionsfähigkeit in Anwendungen und ermöglicht es Node.js, zahlreiche gleichzeitige Vorgänge effizient abzuwickeln.
Das obige ist der detaillierte Inhalt vonDie Stufen der Node.js-Ereignisschleife. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!
Stellungnahme:Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn