Der Inhalt dieses Artikels befasst sich mit der Analyse der Ereignisschleife in JavaScript. Ich hoffe, dass er für Sie hilfreich ist.
Was ist eine Ereignisschleife?
Offizielle Website-Erklärung
Mein persönliches Verständnis ist, dass der einzelne Thread von js darin besteht, dass sein Aufgabenstapel Single-Threaded ist, aber asynchron verarbeitet wird i/o Die Methode besteht darin, sich auf libuv zu verlassen, um den Thread-Pool zur Verarbeitung zu öffnen. Nach Abschluss wird die Aufgabe zur Abfragewarteschlange hinzugefügt. Wenn der Aufgabenstapel leer ist oder das Ereignis den Schwellenwert erreicht, werden die Abfragewarteschlange und der Timer geöffnet Aufgaben werden dem Aufgabenstapel hinzugefügt und diese Schleife wird fortgesetzt. Dies ist im Allgemeinen die Ereignisschleife von js.
Struktur
┌───────────────────────────┐ ┌─>│ timers │ │ └─────────────┬─────────────┘ │ ┌─────────────┴─────────────┐ │ │ pending callbacks │ │ └─────────────┬─────────────┘ │ ┌─────────────┴─────────────┐ │ │ idle, prepare │ │ └─────────────┬─────────────┘ ┌───────────────┐ │ ┌─────────────┴─────────────┐ │ incoming: │ │ │ poll │<p><strong>Timer: </strong><br> Timing-Aufgabe: Wenn sie den Schwellenwert erreicht, wird sie nicht sofort ausgeführt und Aufgaben, die auf den Aufgabenstapel warten, werden blockiert Es. </p><p><strong>ausstehende Rückrufe: </strong><br> In dieser Phase werden Rückrufe für bestimmte Systemvorgänge (z. B. TCP-Fehlertypen) durchgeführt. Einige *nix-Systeme möchten beispielsweise warten, bis ein Fehler gemeldet wird, wenn beim Versuch, eine Verbindung herzustellen, ein TCP-Socket empfangen wird. Dies wird zur Ausführung in der ausstehenden Rückrufphase in die Warteschlange gestellt. </p><p><strong>pull:</strong> <br>Diese Phase hat zwei Hauptfunktionen: <br> berechnet, wie lange E/A blockiert und abgefragt werden soll, und <br> verarbeitet dann die Polling-Warteschlangenereignisse . <br>Wenn die Ereignisschleife in die Abfragephase eintritt und kein Timer geplant ist, geschieht eines von zwei Dingen: </p><p>Wenn die Abfragewarteschlange nicht leer ist, durchläuft die Ereignisschleife sie und führt sie synchron aus Die Warteschlange wird zurückgerufen, bis die Warteschlange erschöpft ist oder ein systemabhängiges hartes Limit erreicht wird. </p><p>Wenn die Umfragewarteschlange leer ist, passiert eines von zwei Dingen: </p><p>Wenn das Skript setImmediate ausgeführt hat, beendet die Ereignisschleife die Umfragephase und fährt mit der Prüfphase fort, um diese auszuführen Planungsskript. </p><p>Wenn das Skript setImmediate nicht ausführt, wartet die Ereignisschleife darauf, dass der Rückruf zur Abfragewarteschlange hinzugefügt wird, und führt ihn dann sofort aus. </p><p>Sobald die Umfragewarteschlange leer ist, überprüft die Ereignisschleife die Timer. Wenn ein oder mehrere Timer bereit sind, springt die Ereignisschleife zur Timerphase zurück, um die Rückrufe für diese Timer auszuführen. </p><p><strong>Prüfung</strong> <br>In dieser Phase kann unmittelbar nach Abschluss der Abfragephase ein Rückruf ausgeführt werden. Wenn die Abfragephase inaktiv wird und eine setImmediate-Aufgabe vorhanden ist, springt die Ereignisschleife direkt zur Überprüfung der Ausführung, anstatt in der Abfragephase zu blockieren und auf das Hinzufügen des Rückrufs zu warten. </p><p>setImmediate ist eigentlich ein spezieller Timer, der in einer separaten Phase der Ereignisschleife läuft. Es verwendet die libuv-API, um Rückrufe zu planen, die nach Abschluss der Abfragephase ausgeführt werden. </p><p><strong>Rückrufe schließen</strong></p><p>Wenn der Socket oder das Handle plötzlich geschlossen wird (z. B. socket.destroy()), wird in dieser Phase das Ereignis „close“ ausgegeben. Andernfalls wird es von process.nextTick() ausgegeben. </p><p>Dieser Artikel ist hier zu Ende. Weitere spannende Inhalte finden Sie in der Spalte <a href="http://www.php.cn/course/list/17.html" target="_blank">JavaScript-Video-Tutorial</a> auf der chinesischen PHP-Website! </p><p><br></p><p> </p>
Das obige ist der detaillierte Inhalt vonAnalyse der Ereignisschleife in JavaScript. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!