Table des matières
L'essence de la macrotâche
microtâche
总结
Maison interface Web js tutoriel Un examen approfondi de la boucle d'événements du navigateur (exemples de code)

Un examen approfondi de la boucle d'événements du navigateur (exemples de code)

Nov 12, 2018 pm 05:06 PM
chrome javascript

Ce que cet article vous apporte, c'est une compréhension approfondie de la boucle d'événements du navigateur (exemples de code). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

La boucle d'événements du navigateur est quelque chose que le front-end connaît très bien et auquel il est exposé quotidiennement. Mais j'ai toujours mémorisé par cœur : La file d'attente des tâches événementielles est divisée en macrotâche et microtâche. Le navigateur retire d'abord une tâche de la macrotâche pour l'exécuter, puis exécute toutes les tâches de la microtâche, puis passe à la macrotâche. pour retirer une tâche à exécuter... ., et ce cycle continue. Mais pour le code suivant, j'ai été confus. SetTimeout appartient à la macrotâche. Selon les règles ci-dessus, setTimeout doit être retiré et exécuté en premier, mais j'ai été giflé par le résultat de l'exécution.

<script>
    setTimeout(() => {
        console.log(1)
    }, 0)
    new Promise((resolve) => {
        console.log(2)
        resolve()
    }).then(() => {
        console.log(3)
    })
    // 我曾经的预期是:2 1 3
    // 实际输出:2 3 1
</script>
Copier après la connexion

Après avoir lu attentivement l'introduction d'autres personnes sur les files d'attente de tâches, j'ai réalisé que le code js exécuté de manière synchrone est en fait une macrotâche (pour être précis, le code dans chaque balise de script est une macrotâche), donc comme mentionné dans les règles ci-dessus, il n'y a aucun problème à supprimer d'abord une macrotâche et exécuter .
De nombreux articles sur Internet l'expliquent comme ci-dessus. J'ai toujours pensé qu'il s'agissait de la spécification HTML de la boucle d'événement, nous devrions donc nous en souvenir. Ce n'est que lorsque j'ai lu récemment l'article de M. Li Yincheng (voir le lien de référence à la fin de l'article) que j'ai soudain réalisé que les articles que j'avais lus auparavant n'analysaient pas clairement le modèle multithread du navigateur depuis le Du point de vue du modèle multithread du navigateur, nous pensons donc que la boucle d'événements du navigateur est basée sur la convention ci-dessus, c'est en fait le résultat du modèle multithread du navigateur.

L'essence de la macrotâche

La macrotâche est essentiellement une file d'attente de messages pour la communication entre plusieurs threads du navigateur
Dans Chrome, chaque page correspond à un processus, qui a plusieurs threads, tels que le thread js, le thread de rendu, le thread io, le thread réseau, le thread de minuterie, etc. La communication entre ces threads se fait en ajoutant une tâche (PostTask) à la file d'attente des tâches de l'autre partie.

Les différents threads du navigateur sont des threads résidents. Ils s'exécutent dans une boucle infinie. Chaque thread a ses propres files d'attente de tâches. Le thread lui-même ou d'autres threads peuvent leur envoyer des messages via PostTask. tâches, et ces threads retireront continuellement les tâches de leurs propres files d'attente de tâches pour les exécuter, ou ils dormiront jusqu'à l'heure définie ou que quelqu'un les réveillera lors de PostTask.

On peut simplement comprendre que chaque thread du navigateur retire constamment des tâches de sa propre file d'attente de tâches, les exécute, retire à nouveau les tâches et les exécute à nouveau, et cela continue dans une boucle infinie.

Prenons le code suivant comme exemple :

<script>
    console.log(1)
    setTimeout(() => {
        console.log(2)
    }, 1000)
    console.log(3)
</script>
Copier après la connexion
  1. Tout d'abord, le code dans la balise script est placé dans la file d'attente des tâches du fil js en tant que tâche , et le thread js est réveillé, puis supprimez la tâche et exécutez

  2. Exécutez d'abord console.log(1), puis exécutez setTimeout, ajoutez une tâche au thread du minuteur, puis exécutez console.log(3). À ce moment, la file d'attente des tâches du thread js est vide et le thread js se met en veille

  3. Environ 1000 ms plus tard, le thread du minuteur ajoute un programmé. tâche (rappel du minuteur) dans la file d'attente des tâches du thread js, et le thread js revient Après avoir été réveillé, la fonction de rappel planifiée est exécutée et enfin console.log(2) est exécuté.

Comme vous pouvez le voir, la soi-disant macrotâche ne signifie pas que le navigateur définit quelles tâches sont des macrotâches. Chaque thread du navigateur fait simplement circuler fidèlement sa propre file d'attente de tâches et. l'exécute en continu. C'est juste une tâche.

microtâche

Par rapport à la macrotâche, qui est une "illusion" provoquée par le modèle multi-thread du navigateur, la microtâche est une file d'attente qui existe. La microtâche appartient au thread actuel, pas aux autres threads. PostTask. La tâche est juste retardée (pour être précis, elle est exécutée après le code de synchronisation actuellement exécuté), comme Promise.then et MutationObserver.

Prenons le code suivant comme exemple :

<script>
    new Promise((resolve) => {
       resolve()
       console.log(1)
       setTimeout(() => {
         console.log(2)
       },0)
    }).then(() => {
        console.log(3)
    })
    // 输出:1 3 2
</script>
Copier après la connexion
  1. Tout d'abord, le code dans la balise script est placé dans la file d'attente des tâches du fil js en tant que tâche , et le thread js est réveillé, puis supprimez la tâche et exécutez

  2. puis exécutez new Promise et résolvez dans Promise. Après la résolution, la fonction de rappel then de promise sera placée dans. la tâche en cours d'exécution comme une tâche qui doit être retardée. Après tout le code de synchronisation

  3. , exécutez setTimeout et ajoutez une tâche au fil du minuteur

  4. .

    À ce moment, le code de synchronisation est exécuté, puis l'exécution est retardée. La tâche exécutée, qui est alors la fonction de rappel de la promesse, consiste à exécuter console.log(3)

  5. Enfin, la file d'attente des tâches du thread js est vide et le thread js se met en veille pendant environ 1000 ms. Enfin, le thread du minuteur ajoute une tâche planifiée (rappel du minuteur) à la file d'attente des tâches du thread js, et le thread js est. se réveille à nouveau et exécute la fonction de rappel planifiée, à savoir 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
*/
Copier après la connexion


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Qu'est-ce que Updater.exe dans Windows 11/10 ? Est-ce le processus Chrome ? Qu'est-ce que Updater.exe dans Windows 11/10 ? Est-ce le processus Chrome ? Mar 21, 2024 pm 05:36 PM

Chaque application que vous exécutez sous Windows dispose d'un programme de composants pour la mettre à jour. Ainsi, si vous utilisez Google Chrome ou Google Earth, il exécutera une application GoogleUpdate.exe, vérifiera si une mise à jour est disponible, puis la mettra à jour en fonction des paramètres. Cependant, si vous ne le voyez plus et voyez à la place un processus updater.exe dans le Gestionnaire des tâches de Windows 11/10, il y a une raison à cela. Qu'est-ce que Updater.exe dans Windows 11/10 ? Google a déployé des mises à jour pour toutes ses applications comme Google Earth, Google Drive, Chrome, etc. Cette mise à jour apporte

Comment mettre en œuvre un système de reconnaissance vocale en ligne à l'aide de WebSocket et JavaScript Comment mettre en œuvre un système de reconnaissance vocale en ligne à l'aide de WebSocket et JavaScript Dec 17, 2023 pm 02:54 PM

Comment utiliser WebSocket et JavaScript pour mettre en œuvre un système de reconnaissance vocale en ligne Introduction : Avec le développement continu de la technologie, la technologie de reconnaissance vocale est devenue une partie importante du domaine de l'intelligence artificielle. Le système de reconnaissance vocale en ligne basé sur WebSocket et JavaScript présente les caractéristiques d'une faible latence, d'un temps réel et d'une multiplateforme, et est devenu une solution largement utilisée. Cet article explique comment utiliser WebSocket et JavaScript pour implémenter un système de reconnaissance vocale en ligne.

Quel est le répertoire d'installation de l'extension du plug-in Chrome ? Quel est le répertoire d'installation de l'extension du plug-in Chrome ? Mar 08, 2024 am 08:55 AM

Quel est le répertoire d’installation de l’extension du plug-in Chrome ? Dans des circonstances normales, le répertoire d'installation par défaut des extensions de plug-in Chrome est le suivant : 1. L'emplacement du répertoire d'installation par défaut des plug-ins Chrome dans Windows XP : C:\DocumentsandSettings\username\LocalSettings\ApplicationData\Google\Chrome\UserData\ Default\Extensions2. chrome dans Windows7 Emplacement du répertoire d'installation par défaut du plug-in : C:\Users\username\AppData\Local\Google\Chrome\User

Comment résoudre le problème selon lequel Google Chrome ne peut pas ouvrir les pages Web Comment résoudre le problème selon lequel Google Chrome ne peut pas ouvrir les pages Web Jan 04, 2024 pm 10:18 PM

Que dois-je faire si la page Web de Google Chrome ne peut pas être ouverte ? De nombreux amis aiment utiliser Google Chrome. Bien sûr, certains amis constatent qu'ils ne peuvent pas ouvrir les pages Web normalement ou que les pages Web s'ouvrent très lentement pendant l'utilisation. Alors, que devez-vous faire si vous rencontrez cette situation ? Jetons un coup d'œil à la solution au problème selon lequel les pages Web de Google Chrome ne peuvent pas être ouvertes avec l'éditeur. Solution au problème selon lequel la page Web de Google Chrome ne peut pas être ouverte Méthode 1. Afin d'aider les joueurs qui n'ont pas encore réussi le niveau, découvrons les méthodes spécifiques de résolution du puzzle. Tout d'abord, cliquez avec le bouton droit sur l'icône du réseau dans le coin inférieur droit et sélectionnez « Paramètres réseau et Internet ». 2. Cliquez sur « Ethernet », puis cliquez sur « Modifier les options de l'adaptateur ». 3. Cliquez sur le bouton "Propriétés". 4. Double-cliquez pour ouvrir i

WebSocket et JavaScript : technologies clés pour mettre en œuvre des systèmes de surveillance en temps réel WebSocket et JavaScript : technologies clés pour mettre en œuvre des systèmes de surveillance en temps réel Dec 17, 2023 pm 05:30 PM

WebSocket et JavaScript : technologies clés pour réaliser des systèmes de surveillance en temps réel Introduction : Avec le développement rapide de la technologie Internet, les systèmes de surveillance en temps réel ont été largement utilisés dans divers domaines. L'une des technologies clés pour réaliser une surveillance en temps réel est la combinaison de WebSocket et de JavaScript. Cet article présentera l'application de WebSocket et JavaScript dans les systèmes de surveillance en temps réel, donnera des exemples de code et expliquera leurs principes de mise en œuvre en détail. 1. Technologie WebSocket

Comment utiliser JavaScript et WebSocket pour mettre en œuvre un système de commande en ligne en temps réel Comment utiliser JavaScript et WebSocket pour mettre en œuvre un système de commande en ligne en temps réel Dec 17, 2023 pm 12:09 PM

Introduction à l'utilisation de JavaScript et de WebSocket pour mettre en œuvre un système de commande en ligne en temps réel : avec la popularité d'Internet et les progrès de la technologie, de plus en plus de restaurants ont commencé à proposer des services de commande en ligne. Afin de mettre en œuvre un système de commande en ligne en temps réel, nous pouvons utiliser les technologies JavaScript et WebSocket. WebSocket est un protocole de communication full-duplex basé sur le protocole TCP, qui peut réaliser une communication bidirectionnelle en temps réel entre le client et le serveur. Dans le système de commande en ligne en temps réel, lorsque l'utilisateur sélectionne des plats et passe une commande

Comment rechercher du texte dans tous les onglets de Chrome et Edge Comment rechercher du texte dans tous les onglets de Chrome et Edge Feb 19, 2024 am 11:30 AM

Ce didacticiel vous montre comment rechercher du texte ou des phrases spécifiques sur tous les onglets ouverts dans Chrome ou Edge sous Windows. Existe-t-il un moyen d'effectuer une recherche de texte sur tous les onglets ouverts dans Chrome ? Oui, vous pouvez utiliser une extension Web externe gratuite dans Chrome pour effectuer des recherches de texte sur tous les onglets ouverts sans avoir à changer d'onglet manuellement. Certaines extensions comme TabSearch et Ctrl-FPlus peuvent vous aider à y parvenir facilement. Comment rechercher du texte dans tous les onglets de Google Chrome ? Ctrl-FPlus est une extension gratuite qui permet aux utilisateurs de rechercher facilement un mot, une expression ou un texte spécifique dans tous les onglets de la fenêtre de leur navigateur. Cette extension

Comment mettre en œuvre un système de réservation en ligne à l'aide de WebSocket et JavaScript Comment mettre en œuvre un système de réservation en ligne à l'aide de WebSocket et JavaScript Dec 17, 2023 am 09:39 AM

Comment utiliser WebSocket et JavaScript pour mettre en œuvre un système de réservation en ligne. À l'ère numérique d'aujourd'hui, de plus en plus d'entreprises et de services doivent fournir des fonctions de réservation en ligne. Il est crucial de mettre en place un système de réservation en ligne efficace et en temps réel. Cet article explique comment utiliser WebSocket et JavaScript pour implémenter un système de réservation en ligne et fournit des exemples de code spécifiques. 1. Qu'est-ce que WebSocket ? WebSocket est une méthode full-duplex sur une seule connexion TCP.

See all articles