Maison >interface Web >js tutoriel >Analyse de la boucle d'événements en JavaScript

Analyse de la boucle d'événements en JavaScript

不言
不言avant
2019-03-26 09:36:291679parcourir

Le contenu de cet article concerne l'analyse de la boucle d'événement en JavaScript. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

Qu'est-ce que la boucle d'événement ?

Explication officielle du site Web

Analyse de la boucle dévénements en JavaScript

Ma compréhension personnelle est que le thread unique de js est que sa pile de tâches est à thread unique, mais elle gère les tâches asynchrones i/o La méthode consiste à s'appuyer sur libuv pour ouvrir le pool de threads pour le traitement. Une fois terminé, la tâche est ajoutée à la file d'attente d'interrogation, puis lorsque la pile de tâches est vide ou que l'événement atteint le seuil, la file d'attente d'interrogation et le minuteur. les tâches sont ajoutées à la pile de tâches, et continuent cette boucle, il s'agit généralement de la boucle d'événement de js.

Structure

   ┌───────────────────────────┐
┌─>│           timers          │
│  └─────────────┬─────────────┘
│  ┌─────────────┴─────────────┐
│  │     pending callbacks     │
│  └─────────────┬─────────────┘
│  ┌─────────────┴─────────────┐
│  │       idle, prepare       │
│  └─────────────┬─────────────┘      ┌───────────────┐
│  ┌─────────────┴─────────────┐      │   incoming:   │
│  │           poll            │<p><strong>timer : </strong><br>Tâche de synchronisation, lorsqu'elle atteint le seuil, elle ne sera pas exécutée immédiatement, et la tâche qui attendra la pile de tâches sera bloquée. </p><p><strong>rappels en attente : </strong><br> Cette phase effectue des rappels pour certaines opérations système (telles que les types d'erreurs TCP). Par exemple, certains systèmes * nix souhaitent attendre pour signaler une erreur si un socket TCP est reçu lors de la tentative de connexion. Celui-ci sera mis en file d'attente pour exécution dans la phase de rappel en attente. </p><p><strong>pull :</strong> <br>Cette étape a deux fonctions principales : <br> calcule la durée pendant laquelle elle doit bloquer et interroger les E/S, puis <br> traite les événements de la file d'attente d'interrogation . <br>Lorsque la boucle d'événements entre dans la phase d'interrogation et qu'aucun minuteur n'est programmé, l'une des deux choses suivantes se produit : </p><p>Si la file d'attente d'interrogation n'est pas vide, la boucle d'événements les parcourt en les exécutant de manière synchrone. est rappelé jusqu'à ce que la file d'attente soit épuisée ou qu'une limite stricte dépendante du système soit atteinte. </p><p>Si la file d'attente d'interrogation est vide, l'une des deux choses suivantes se produira : </p><p>Si le script a exécuté setImmediate, la boucle d'événements mettra fin à la phase d'interrogation et poursuivra la phase de vérification pour les exécuter Script de planification. </p><p>Si le script n'exécute pas setImmediate, la boucle d'événements attendra que le rappel soit ajouté à la file d'attente d'interrogation, puis l'exécutera immédiatement. </p><p>Une fois la file d'attente d'interrogation vide, la boucle d'événements vérifiera les minuteries, et si une ou plusieurs minuteries sont prêtes, la boucle d'événements reviendra à la phase de minuterie pour exécuter les rappels pour ces minuteries. </p><p><strong>check</strong> <br>Cette phase permet d'exécuter un rappel immédiatement après la fin de la phase d'interrogation. Si la phase d'interrogation devient inactive et qu'il y a une tâche setImmediate, la boucle d'événements saute directement pour vérifier l'exécution au lieu de se bloquer dans la phase d'interrogation en attendant que le rappel soit ajouté. </p><p>setImmediate est en fait un minuteur spécial qui s'exécute dans une étape distincte de la boucle d'événements. Il utilise l'API libuv pour planifier l'exécution des rappels une fois la phase d'interrogation terminée. </p><p><strong>rappels de fermeture</strong></p><p>Si le socket ou le handle est fermé soudainement (par exemple socket.destroy()), l'événement 'close' sera émis à ce stade. Sinon, il sera émis par process.nextTick(). </p><p>Cet article est terminé ici. Pour un contenu plus passionnant, vous pouvez faire attention à la colonne <a href="http://www.php.cn/course/list/17.html" target="_blank">Tutoriel vidéo JavaScript</a> du site Web PHP chinois ! </p><p><br></p><p> </p>

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer