Maison  >  Article  >  interface Web  >  Explication du mécanisme d'interrogation des événements JS

Explication du mécanisme d'interrogation des événements JS

小云云
小云云original
2018-03-26 16:33:234267parcourir

JS est un langage monothread.Compréhension approfondie de Event Loop dans JS Cet article partage principalement avec vous le mécanisme d'interrogation des événements JS, dans l'espoir d'aider tout le monde.

Mécanisme d'exécution JS (1) :

1. Déterminez d'abord si JS est synchrone ou asynchrone. S'il est synchrone, il entrera dans le processus principal, s'il est asynchrone, il entrera. la table des événements

2. Asynchrone La tâche enregistre une fonction dans la table des événements lorsque la condition de déclenchement est remplie, elle est poussée dans la file d'attente des événements

3. après être entré dans le thread principal, il n'ira pas dans la file d'attente des événements pour vérifier s'il existe des tâches asynchrones exécutables, poussez-les dans le processus principal

Mécanisme d'exécution JS (2)

1. . Exécutez une macro-tâche. Si une micro-tâche est rencontrée pendant le processus, placez-la dans la [File d'attente des événements] de la microtâche

2. Une fois la macro-tâche en cours exécutée, la [File d'attente des événements] de la microtâche. la microtâche sera visualisée et toutes les microtâches qu'elle contient seront exécutées dans l'ordre

Méthode de division des tâches :

1.macro-tâche (macro-tâche) : script, setTimeout, setInterval

2. micro-tâche (micro tâche) : Promesse, process.nextTick

Nous partons d'une petite question

for (var i=0;i<=5;i++){
    setTimeout(()=>{console.log(i)},1000)
}

Le résultat de sortie doit être 6 6 consécutifs imprimés après 1. Deuxièmement, bien que le principal point de connaissance de cette question soit la portée au niveau du bloc, elle est très appropriée pour introduire un mécanisme d'interrogation d'événements. Parce que setTimeout est une tâche asynchrone, elle ne sera pas exécutée immédiatement. Elle doit attendre que toutes les tâches synchrones soient exécutées, c'est-à-dire que la boucle for se termine lorsque i devient 6, et commence à exécuter 6 timers en même temps. fois, je pointe vers la valeur globale de 6. variable, donc imprime 6, c'est le mécanisme d'exécution JS (1)

Pour rendre les choses plus difficiles, considérons le mécanisme d'exécution JS (2)

// promise里面的函数是立即执行的// 分别输出 2 3 5 4 1setTimeout(function () {
    console.log(1)
},0);new Promise(function executor(resolve) {
    console.log(2);    for(var i=0;i<10000;i++){
        i==9999 && resolve();
    }
    console.log(3);
}).then(function () {
    console.log(4);
});
console.log(5);

La première tâche macro à exécuter doit être le script (script), donc le minuteur sera ignoré (peu importe le nombre de secondes que vous retardez l'exécution), puis exécutera le contenu de la promesse, dans l'ordre, imprimez 2 d'abord, puis effectuez une boucle for. solve() est une fonction de rappel asynchrone, qui appartient au contenu de l'exécution asynchrone, et comme nous l'avons mentionné dans la division des tâches, Promise appartient à la microtâche, donc la file d'attente des événements de la microtâche sera effacée après la macrotâche se termine, donc 3, 5 et 4 seront imprimés ensuite.
À ce stade, la première tâche macro a été traitée, puis c'est au tour du timer.

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:
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