VorwortWie wir alle wissen, ist JavaScript im Kern ein Single-Thread-System, aber Browser können asynchrone Anfragen sehr gut verarbeiten. Warum ist das so? Das Prinzip dahinter hat viel mit dem Ereignisschleifenmechanismus zu tun. Bevor wir die Ereignisschleife untersuchen, müssen wir den Ausführungsthread des Browsers verstehen ~~ Der Rendering-Prozess des Browsers ist multithreaded. Jeder Tab im Browser stellt einen unabhängigen Prozess dar. Der Browserkernel ist einer der Multiprozesse des Browsers und hauptsächlich für das Seiten-Rendering, die Skriptausführung, die Ereignisverarbeitung usw. verantwortlich. Die darin enthaltenen Themen sind die folgenden
Nachdem Sie den Browser-Rendering-Prozess verstanden haben, müssen Sie auch den Betriebsmechanismus von JS verstehen. Der Betriebsmechanismus von JS ist die Ereignisschleife AusführungsstapelDie Umgebung, in der JS ausgeführt wird, wird als Hostumgebung bezeichnet. Ausführungsstapel: Aufrufstapel, eine Datenstruktur, die zum Speichern der Ausführungsumgebung verschiedener Funktionen verwendet wird. Bevor jede Funktion ausgeführt wird, werden ihre zugehörigen Informationen zum Ausführungsstapel hinzugefügt. Bevor eine Funktion aufgerufen wird, wird eine Ausführungsumgebung erstellt und dann zum Ausführungsstapel hinzugefügt; nach dem Aufruf einer Funktion wird die Ausführungsumgebung zerstört. EreignisschleifeAlle Aufgaben in js können in synchrone und asynchrone Aufgaben unterteilt werden. Synchrone Aufgaben sind Aufgaben, die sofort ausgeführt werden. Synchrone Aufgaben gelangen im Allgemeinen direkt zur Ausführung in den Hauptthread; asynchrone Aufgaben hingegen sind Aufgaben, die asynchron ausgeführt werden, wie z. B. Ajax-Netzwerkanforderungen, SetTimeout-Timing-Funktionen usw., die alle asynchrone Aufgaben sind. Asynchrone Aufgaben werden über den Aufgabenwarteschlangenmechanismus (First-In-First-Out) koordiniert. Synchrone und asynchrone Aufgaben gelangen jeweils in unterschiedliche Ausführungsumgebungen. Synchrone Aufgaben gelangen in den Hauptthread, also den Hauptausführungsstapel, und asynchrone Aufgaben gelangen in die Aufgabenwarteschlange. Wenn die Aufgaben im Hauptthread abgeschlossen und leer sind, wird die Aufgabenwarteschlange gelesen, um die entsprechenden Aufgaben zu lesen und zur Ausführung in den Hauptthread zu verschieben. Diese ständige Wiederholung nennen wir die Ereignisschleife. Der konkrete Vorgang ist in der folgenden Abbildung dargestellt. In der Ereignisschleife wird jede Schleifenoperation als Tick bezeichnet. Die Schritte jedes Tick-Task-Schlüssels können wie folgt zusammengefasst werden: 1. Führen Sie eine Makroaufgabe aus (wenn sich keine Makroaufgabe im Stapel befindet, holen Sie sie aus der Ereigniswarteschlange); 2. Wenn während der Ausführung eine Mikroaufgabe auftritt, fügen Sie sie der Aufgabenwarteschlange der Mikroaufgabe hinzu; 3. Nachdem die Makroaufgabe ausgeführt wurde, werden alle Mikroaufgaben in der aktuellen Mikroaufgabenwarteschlange sofort (nacheinander) ausgeführt; 4. Nachdem die aktuelle Makroaufgabe ausgeführt wurde, beginnen Sie mit der Überprüfung des Renderings, und dann übernimmt der GUI-Thread das Rendering; 5. Nachdem das Rendering abgeschlossen ist, übernimmt der JS-Thread weiter und startet die nächste Makroaufgabe (holt sie aus der Ereigniswarteschlange). Zu den Makroaufgaben gehören hauptsächlich: Skript (gesamter Code), setTimeout, setInterval, I/O, UI-Interaktionsereignisse, setImmediate (Node.js-Umgebung) Beispiel für eine Ereignisschleifeconsole.log('Skriptstart'); //Das gesamte Skript tritt als erste Makroaufgabe in den Hauptthread ein, stößt auf console.log und gibt den Skriptstart aus. setzeTimeout(Funktion() { console.log('Zeitüberschreitung festlegen'); }, 0); //Wenn setTimeout auftritt, wird seine Rückruffunktion an die Makroaufgabe Event Queue Promise.resolve().then(function() { verteilt. Konsole.log('Versprechen1'); }).dann(Funktion() { console.log('versprechen2'); }); //Wenn Promise gefunden wird, wird seine then-Funktion der Microtask-Ereigniswarteschlange zugewiesen und als then1 aufgezeichnet. Dann wird eine weitere then-Funktion gefunden und der Microtask-Ereigniswarteschlange zugewiesen und als then2 aufgezeichnet. console.log('Skriptende'); //Wenn console.log auftritt, geben Sie das Skriptende aus Auf diese Weise gibt es drei Aufgaben in der Ereigniswarteschlange: Makroaufgabe: setTimeout Mikroaufgaben: then1, then2. Führen Sie zuerst die Mikrotask then1 aus, geben Sie promise1 aus, führen Sie dann then2 aus und geben Sie promise2 aus, damit alle Mikrotasks gelöscht werden Führen Sie die Aufgabe setTimeout aus und geben Sie setTimeout aus. Bisher lautet die Ausgabereihenfolge: Skriptstart, Skriptende, Promise1, Promise2, setTimeout Zusammenfassen:JavaScript ist eine Single-Thread-Sprache. Asynchrone Operationen werden in die Ereignisschleifenwarteschlange gestellt und warten auf die Ausführung durch den Hauptausführungsstapel. Es gibt keinen dedizierten asynchronen Ausführungsthread. Dies ist das Ende dieses Artikels über den Event-Loop-Mechanismus von js. Weitere relevante Inhalte zum Event-Loop von js finden Sie in den vorherigen Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird! Das könnte Sie auch interessieren:
|
>>: CentOS8-Netzwerkkarten-Konfigurationsdatei
Inhaltsverzeichnis Hintergrund Was ist das Metave...
Installieren Sie die entpackte Version der MySql-...
Einführung Wenn die MySQL InnoDB-Engine Datensätz...
Allerdings ist die Häufigkeit des Shell-Starts se...
Nach der Installation von MySQL geben Sie mysql -...
Teilen Sie einen Echtzeituhreffekt, der mit nativ...
Inhaltsverzeichnis 1. Übergang von der Entwicklun...
Die Position der Bildlaufleiste bleibt beim Scrol...
IE10 bietet eine Schaltfläche zum schnellen Lösche...
Inhaltsverzeichnis 1.1 Java-Umgebung als Vorausse...
Beim Hochladen auf einigen Websites wird nach dem...
Inhaltsverzeichnis Grundlegende Anwendung eingebe...
In diesem Artikel finden Sie ein grafisches Tutor...
1. Zeitdifferenzfunktionen (TIMESTAMPDIFF, DATEDI...
Für jedes DBMS sind die Indizes der wichtigste Op...