Inhaltsverzeichnis
Die Essenz von Makrotask
Microtask
总结
Heim Web-Frontend js-Tutorial Ein detaillierter Blick auf die Browser-Ereignisschleife (Codebeispiele)

Ein detaillierter Blick auf die Browser-Ereignisschleife (Codebeispiele)

Nov 12, 2018 pm 05:06 PM
chrome javascript

Dieser Artikel vermittelt Ihnen ein tiefgreifendes Verständnis der Browser-Ereignisschleife (Codebeispiele). Ich hoffe, dass er Ihnen als Referenz dienen wird.

Die Ereignisschleife des Browsers ist etwas, mit dem das Frontend nur allzu vertraut ist und mit dem wir täglich in Berührung kommen. Aber ich habe es mir immer auswendig gelernt: Die Ereignisaufgabenwarteschlange ist in Makrotask und Mikrotask unterteilt. Der Browser nimmt zuerst eine Aufgabe aus der Makrotask zur Ausführung, führt dann alle Aufgaben in der Mikrotask aus und wechselt dann zur Makrotask eine Aufgabe zur Ausführung herausnehmen... ., und dieser Zyklus geht weiter. Aber für den folgenden Code war ich verwirrt. Gemäß den oben genannten Regeln sollte setTimeout zuerst herausgenommen und ausgeführt werden, aber das Ausführungsergebnis hat mich umgehauen.

<script>
    setTimeout(() => {
        console.log(1)
    }, 0)
    new Promise((resolve) => {
        console.log(2)
        resolve()
    }).then(() => {
        console.log(3)
    })
    // 我曾经的预期是:2 1 3
    // 实际输出:2 3 1
</script>
Nach dem Login kopieren

Nachdem ich die Einführung anderer Leute in Aufgabenwarteschlangen sorgfältig gelesen hatte, wurde mir klar, dass der synchron ausgeführte js-Code tatsächlich eine Makrotask ist (genauer gesagt ist der Code in jedem Skript-Tag eine Makrotask), also das Obige In den Regeln heißt es, dass zuerst eine Makroaufgabe herausnimmt und ausführt.
Viele Artikel im Internet erklären es wie oben. Ich habe immer gedacht, dass dies die HTML-Spezifikation der Ereignisschleife ist, also sollten wir uns daran erinnern. Erst als ich kürzlich den Artikel von Herrn Li Yincheng las (siehe Referenzlink am Ende des Artikels), wurde mir plötzlich klar, dass die Artikel, die ich zuvor gelesen hatte, das Multithreading-Modell des Browsers nicht klar analysierten Aus der Perspektive des Multithreading-Modells des Browsers gehen wir davon aus, dass die Ereignisschleife des Browsers basierend auf der obigen Konvention tatsächlich das Ergebnis des Multithreading-Modells des Browsers ist.

Die Essenz von Makrotask

Makrotask ist im Wesentlichen eine Nachrichtenwarteschlange für die Kommunikation zwischen mehreren Threads des Browsers
In Chrome entspricht jede Seite einem Prozess, der verfügt über mehrere Threads, wie z. B. JS-Thread, Rendering-Thread, IO-Thread, Netzwerk-Thread, Timer-Thread usw. Die Kommunikation zwischen diesen Threads wird durch Hinzufügen einer Aufgabe (PostTask) zur Aufgabenwarteschlange der anderen Partei realisiert.

Die verschiedenen Threads des Browsers laufen in einer for-Endlosschleife. Der Thread selbst oder andere Threads können über die Task-Warteschlange Nachrichten senden Aufgaben, und diese Threads nehmen kontinuierlich Aufgaben aus ihren eigenen Aufgabenwarteschlangen zur Ausführung, oder sie bleiben stehen, bis die festgelegte Zeit abgelaufen ist oder jemand sie bei PostTask aufweckt.

Es kann einfach verstanden werden, dass jeder Thread des Browsers ständig Aufgaben aus seiner eigenen Aufgabenwarteschlange herausnimmt, diese ausführt, die Aufgaben erneut herausnimmt und erneut ausführt, und dies in einer Endlosschleife fortgesetzt wird.

Nehmen Sie den folgenden Code als Beispiel:

<script>
    console.log(1)
    setTimeout(() => {
        console.log(2)
    }, 1000)
    console.log(3)
</script>
Nach dem Login kopieren
  1. Zuerst wird der Code im Skript-Tag als Aufgabe in die Aufgabenwarteschlange des JS-Threads gestellt js-Thread wird aktiviert und dann Nehmen Sie die Aufgabe heraus und führen Sie sie aus

  2. Führen Sie zuerst console.log(1) aus, führen Sie dann setTimeout aus, fügen Sie eine Aufgabe zum Timer-Thread hinzu und führen Sie dann die Konsole aus .log(3). Zu diesem Zeitpunkt ist die Aufgabenwarteschlange des JS-Threads leer und der JS-Thread geht in den Ruhezustand

  3. Ungefähr 1000 ms später fügt der Timer-Thread eine geplante Aufgabe hinzu ( Timer-Rückruf) in die Aufgabenwarteschlange des JS-Threads, und der JS-Thread wird erneut aktiviert. Führen Sie die geplante Rückruffunktion aus und führen Sie schließlich console.log (2) aus.

Wie Sie sehen, bedeutet die sogenannte Makrotask nicht, dass der Browser definiert, welche Aufgaben Makrotask sind. Jeder Thread des Browsers zirkuliert einfach seine eigene Aufgabenwarteschlange führt es kontinuierlich aus. Es ist nur eine Aufgabe.

Microtask

Im Vergleich zu Macrotask, das eine „Illusion“ ist, die durch das Multithreading-Modell des Browsers verursacht wird, handelt es sich bei Microtask um eine Warteschlange, die zum aktuellen Thread gehört, nicht zu anderen Threads PostTask. Die Aufgabe wird nur verzögert (genauer gesagt, sie wird nach dem aktuell ausgeführten Synchronisationscode ausgeführt), wie z. B. Promise.then und MutationObserver.

Nehmen Sie den folgenden Code als Beispiel:

<script>
    new Promise((resolve) => {
       resolve()
       console.log(1)
       setTimeout(() => {
         console.log(2)
       },0)
    }).then(() => {
        console.log(3)
    })
    // 输出:1 3 2
</script>
Nach dem Login kopieren
  1. Zuerst wird der Code im Skript-Tag als Aufgabe in die Aufgabenwarteschlange des JS-Threads gestellt js-Thread wird aktiviert, und dann wird die Aufgabe herausgenommen,

  2. ausgeführt und dann ein neues Promise ausgeführt und in Promise aufgelöst. Nach der Auflösung wird die Rückruffunktion von Promise als Aufgabe verwendet Das muss verzögert und in alle aktuell ausgeführten Synchronisierungen eingefügt werden. Führen Sie nach dem Code

  3. setTimeout aus und fügen Sie eine Aufgabe zum Timer-Thread hinzu

  4. Zu diesem Zeitpunkt wird der Synchronisierungscode ausgeführt und anschließend die verzögerte Ausführung. Die Aufgabe, die dann die Callback-Funktion von Promise ist, besteht darin, console.log(3)

  5. Schließlich ist die Aufgabenwarteschlange des JS-Threads leer und der JS-Thread geht in den Ruhezustand. Nach etwa 1000 ms fügt der Timer-Thread eine geplante Aufgabe (Timer-Rückruf) zur JS-Thread-Aufgabenwarteschlange hinzu und der JS-Thread wird wieder aktiviert und führt die geplante Rückruffunktion aus, nämlich console.log(2).

总结

通过上面的分析,可以看到,文章开头提到的规则:浏览器先从macrotask取出一个任务执行,再执行microtask内的所有任务,接着又去macrotask取出一个任务执行...,并没有说错,但这只是浏览器执行机制造成的现象,而不是说浏览器按照这样的规则去执行的代码。
这篇文章中的所有干货都来自李银成大佬的文章,我只是按照自己的理解,做了简化描述,方便大家理解,也加深自己的印象。
最后,看了这篇文章,大家能够基于浏览器的运行机制,分析出下面代码的执行结果了吗(ps:不要用死记硬背的规则去分析哟)

console.log('start')

const interval = setInterval(() => {  
  console.log('setInterval')
}, 0)

setTimeout(() => {  
  console.log('setTimeout 1')
  Promise.resolve()
      .then(() => {
        console.log('promise 3')
      })
      .then(() => {
        console.log('promise 4')
      })
      .then(() => {
        setTimeout(() => {
          console.log('setTimeout 2')
          Promise.resolve()
              .then(() => {
                console.log('promise 5')
              })
              .then(() => {
                console.log('promise 6')
              })
              .then(() => {
                clearInterval(interval)
              })
        }, 0)
      })
}, 0)

Promise.resolve()
    .then(() => {  
        console.log('promise 1')
    })
    .then(() => {
        console.log('promise 2')
    })
// 执行结果
/*  start
    promise 1
    promise 2
    setInterval
    setTimeout 1
    promise 3
    promise 4
    setInterval
    setTimeout 2
    promise 5
    promise 6
*/
Nach dem Login kopieren


Das obige ist der detaillierte Inhalt vonEin detaillierter Blick auf die Browser-Ereignisschleife (Codebeispiele). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Was ist Updater.exe in Windows 11/10? Ist das der Chrome-Prozess? Was ist Updater.exe in Windows 11/10? Ist das der Chrome-Prozess? Mar 21, 2024 pm 05:36 PM

Jede Anwendung, die Sie unter Windows ausführen, verfügt über ein Komponentenprogramm, um sie zu aktualisieren. Wenn Sie also Google Chrome oder Google Earth verwenden, wird die Anwendung „GoogleUpdate.exe“ ausgeführt, geprüft, ob ein Update verfügbar ist, und es dann basierend auf den Einstellungen aktualisiert. Wenn Sie es jedoch nicht mehr sehen und stattdessen einen Prozess updater.exe im Task-Manager von Windows 11/10 sehen, gibt es dafür einen Grund. Was ist Updater.exe in Windows 11/10? Google hat Updates für alle seine Apps wie Google Earth, Google Drive, Chrome usw. bereitgestellt. Dieses Update bringt

So implementieren Sie ein Online-Spracherkennungssystem mit WebSocket und JavaScript So implementieren Sie ein Online-Spracherkennungssystem mit WebSocket und JavaScript Dec 17, 2023 pm 02:54 PM

So implementieren Sie mit WebSocket und JavaScript ein Online-Spracherkennungssystem. Einführung: Mit der kontinuierlichen Weiterentwicklung der Technologie ist die Spracherkennungstechnologie zu einem wichtigen Bestandteil des Bereichs der künstlichen Intelligenz geworden. Das auf WebSocket und JavaScript basierende Online-Spracherkennungssystem zeichnet sich durch geringe Latenz, Echtzeit und plattformübergreifende Eigenschaften aus und hat sich zu einer weit verbreiteten Lösung entwickelt. In diesem Artikel wird erläutert, wie Sie mit WebSocket und JavaScript ein Online-Spracherkennungssystem implementieren.

Was ist das Installationsverzeichnis der Chrome-Plug-in-Erweiterung? Was ist das Installationsverzeichnis der Chrome-Plug-in-Erweiterung? Mar 08, 2024 am 08:55 AM

Was ist das Installationsverzeichnis der Chrome-Plug-in-Erweiterung? Unter normalen Umständen lautet das Standardinstallationsverzeichnis von Chrome-Plug-In-Erweiterungen wie folgt: 1. Der Standard-Installationsverzeichnis-Speicherort von Chrome-Plug-Ins in Windows XP: C:\DocumentsandSettings\Benutzername\LocalSettings\ApplicationData\Google\Chrome\UserData\ Default\Extensions2. Chrome in Windows7 Der Standardinstallationsverzeichnisspeicherort des Plug-Ins: C:\Benutzer\Benutzername\AppData\Local\Google\Chrome\User

So lösen Sie das Problem, dass Google Chrome keine Webseiten öffnen kann So lösen Sie das Problem, dass Google Chrome keine Webseiten öffnen kann Jan 04, 2024 pm 10:18 PM

Was soll ich tun, wenn die Google Chrome-Webseite nicht geöffnet werden kann? Viele Freunde verwenden gerne Google Chrome. Einige Freunde stellen jedoch fest, dass sie Webseiten nicht normal öffnen können oder dass sich die Webseiten während der Nutzung nur sehr langsam öffnen. Werfen wir einen Blick auf die Lösung des Problems, dass Google Chrome-Webseiten nicht mit dem Editor geöffnet werden können. Lösung für das Problem, dass die Google Chrome-Webseite nicht geöffnet werden kann. Methode 1. Um Spielern zu helfen, die das Level noch nicht bestanden haben, erfahren Sie mehr über die spezifischen Methoden zum Lösen des Rätsels. Klicken Sie zunächst mit der rechten Maustaste auf das Netzwerksymbol in der unteren rechten Ecke und wählen Sie „Netzwerk- und Interneteinstellungen“. 2. Klicken Sie auf „Ethernet“ und dann auf „Adapteroptionen ändern“. 3. Klicken Sie auf die Schaltfläche „Eigenschaften“. 4. Doppelklicken Sie, um i zu öffnen

WebSocket und JavaScript: Schlüsseltechnologien zur Implementierung von Echtzeitüberwachungssystemen WebSocket und JavaScript: Schlüsseltechnologien zur Implementierung von Echtzeitüberwachungssystemen Dec 17, 2023 pm 05:30 PM

WebSocket und JavaScript: Schlüsseltechnologien zur Realisierung von Echtzeit-Überwachungssystemen Einführung: Mit der rasanten Entwicklung der Internet-Technologie wurden Echtzeit-Überwachungssysteme in verschiedenen Bereichen weit verbreitet eingesetzt. Eine der Schlüsseltechnologien zur Erzielung einer Echtzeitüberwachung ist die Kombination von WebSocket und JavaScript. In diesem Artikel wird die Anwendung von WebSocket und JavaScript in Echtzeitüberwachungssystemen vorgestellt, Codebeispiele gegeben und deren Implementierungsprinzipien ausführlich erläutert. 1. WebSocket-Technologie

Verwendung von JavaScript und WebSocket zur Implementierung eines Echtzeit-Online-Bestellsystems Verwendung von JavaScript und WebSocket zur Implementierung eines Echtzeit-Online-Bestellsystems Dec 17, 2023 pm 12:09 PM

Einführung in die Verwendung von JavaScript und WebSocket zur Implementierung eines Online-Bestellsystems in Echtzeit: Mit der Popularität des Internets und dem Fortschritt der Technologie haben immer mehr Restaurants damit begonnen, Online-Bestelldienste anzubieten. Um ein Echtzeit-Online-Bestellsystem zu implementieren, können wir JavaScript und WebSocket-Technologie verwenden. WebSocket ist ein Vollduplex-Kommunikationsprotokoll, das auf dem TCP-Protokoll basiert und eine bidirektionale Kommunikation zwischen Client und Server in Echtzeit realisieren kann. Im Echtzeit-Online-Bestellsystem, wenn der Benutzer Gerichte auswählt und eine Bestellung aufgibt

So suchen Sie auf allen Registerkarten in Chrome und Edge nach Text So suchen Sie auf allen Registerkarten in Chrome und Edge nach Text Feb 19, 2024 am 11:30 AM

Dieses Tutorial zeigt Ihnen, wie Sie bestimmte Texte oder Phrasen auf allen geöffneten Tabs in Chrome oder Edge unter Windows finden. Gibt es eine Möglichkeit, eine Textsuche auf allen geöffneten Tabs in Chrome durchzuführen? Ja, Sie können eine kostenlose externe Weberweiterung in Chrome verwenden, um Textsuchen auf allen geöffneten Tabs durchzuführen, ohne die Tabs manuell wechseln zu müssen. Einige Erweiterungen wie TabSearch und Strg-FPlus können Ihnen dabei helfen, dies einfach zu erreichen. Wie durchsucht man Text auf allen Registerkarten in Google Chrome? Strg-FPlus ist eine kostenlose Erweiterung, die es Benutzern erleichtert, auf allen Registerkarten ihres Browserfensters nach einem bestimmten Wort, einer bestimmten Phrase oder einem bestimmten Text zu suchen. Diese Erweiterung

So implementieren Sie ein Online-Reservierungssystem mit WebSocket und JavaScript So implementieren Sie ein Online-Reservierungssystem mit WebSocket und JavaScript Dec 17, 2023 am 09:39 AM

So implementieren Sie ein Online-Reservierungssystem mit WebSocket und JavaScript. Im heutigen digitalen Zeitalter müssen immer mehr Unternehmen und Dienste Online-Reservierungsfunktionen bereitstellen. Es ist von entscheidender Bedeutung, ein effizientes Online-Reservierungssystem in Echtzeit zu implementieren. In diesem Artikel wird erläutert, wie Sie mit WebSocket und JavaScript ein Online-Reservierungssystem implementieren, und es werden spezifische Codebeispiele bereitgestellt. 1. Was ist WebSocket? WebSocket ist eine Vollduplex-Methode für eine einzelne TCP-Verbindung.

See all articles