Maison > interface Web > Questions et réponses frontales > Que sont les microtâches en javascript ?

Que sont les microtâches en javascript ?

青灯夜游
Libérer: 2022-02-08 11:44:58
original
5864 Les gens l'ont consulté

En javascript, les microtâches incluent : 1. "Promise" ; 2. "Object.observe" ; 3. "MutationObserver" ; 4. "process.nextTick" dans l'environnement Node.js ;

Que sont les microtâches en javascript ?

L'environnement d'exploitation de ce tutoriel : système Windows 7, JavaScript version 1.8.5, ordinateur Dell G3.

Event Loop

Une caractéristique majeure du langage JavaScript est qu'il est monothread, ce qui signifie qu'il ne peut faire qu'une seule chose à la fois. Afin de coordonner les événements, l'interaction utilisateur, les scripts, le rendu de l'interface utilisateur, le traitement du réseau et d'autres activités afin d'empêcher le blocage du thread principal, la solution Event Loop est née. Event Loop comprend deux types : l’un est basé sur le contexte de navigation et l’autre est basé sur le travailleur. Les deux fonctionnent indépendamment, c'est-à-dire que chaque « environnement de thread » dans lequel JavaScript s'exécute possède une boucle d'événements indépendante, et chaque Web Worker possède également une boucle d'événements indépendante.

La boucle d'événements impliquée dans cet article est basée sur le contexte de navigation.

Task Queue

Selon la spécification, la boucle d'événements est coordonnée via le mécanisme de la file d'attente des tâches. Dans une boucle d'événements, il peut y avoir une ou plusieurs files d'attente de tâches. Une file d'attente de tâches est un ensemble de tâches ordonnées ; chaque tâche a une source de tâches, qui provient de la même file d'attente de tâches. Les tâches d'une source de tâches doivent être placées dans la même. file d'attente des tâches, tandis que les tâches provenant de différentes sources sont ajoutées à différentes files d'attente. Les API telles que setTimeout/Promise sont des sources de tâches, et ce qui entre dans la file d'attente des tâches est la tâche d'exécution spécifique qu'elles spécifient.

Dans la boucle d'événements, chaque opération de boucle est appelée un tick. Le modèle de traitement des tâches de chaque tick est relativement compliqué, mais les étapes clés sont les suivantes :

  • Sélectionnez la tâche qui entre en premier dans la file d'attente dans ce tick ( tâche la plus ancienne), s'il y en a une, exécutez-la (une fois)

  • Vérifiez s'il y a des microtâches, s'il y a des microtâches, exécutez-la en continu jusqu'à ce que la file d'attente des microtâches soit effacée

  • Mettre à jour le rendu

  • Le fil principal répète les étapes ci-dessus

Vous devez comprendre quelques points en fonction de la coche d'appel :

  • JS est divisé en tâches synchrones et tâches asynchrones

  • Les tâches synchrones sont exécutées sur le thread principal, formant une exécution stack

  • en dehors du thread principal, le thread déclencheur d'événement gère une file d'attente de tâches. Tant que la tâche asynchrone a un résultat en cours d'exécution, un événement est placé dans la file d'attente des tâches.

  • Une fois que toutes les tâches synchrones de la pile d'exécution sont exécutées (le moteur JS est inactif à ce moment-là), le système lira la file d'attente des tâches, ajoutera des tâches asynchrones exécutables à la pile exécutable et lancera l'exécution.

Que sont les microtâches en javascript ?

Macro tâche

(macro)tâche, on peut comprendre que le code exécuté par la pile d'exécution à chaque fois est une macro tâche (y compris à chaque fois qu'un rappel d'événement est obtenu à partir de l'événement file d'attente et mise en exécution exécutée sur la pile).

Afin de permettre l'exécution ordonnée des tâches (macro) internes de JS et des tâches DOM, le navigateur restituera la page après la fin de l'exécution d'une tâche (macro) et avant le début de l'exécution de la tâche (macro) suivante. . Le processus Comme suit :

(macro)task->渲染->(macro)task->...
Copier après la connexion

Les tâches macro comprennent :

script(整体代码)
setTimeout
setInterval
I/O
UI交互事件
postMessage
MessageChannel
setImmediate(Node.js 环境)
Copier après la connexion

Micro tâches

microtâche, qui peut être comprise comme une tâche exécutée immédiatement après la fin de l'exécution de la tâche en cours. C'est-à-dire après la tâche en cours, avant la tâche suivante et avant le rendu.

Sa vitesse de réponse sera donc plus rapide que setTimeout (setTimeout est une tâche), car il n'est pas nécessaire d'attendre le rendu. C'est-à-dire qu'après l'exécution d'une certaine macrotâche, toutes les microtâches générées lors de son exécution seront exécutées (avant le rendu).

Les microtâches incluent :

Promise
Object.observe
MutationObserver
process.nextTick(Node.js 环境)
async/await
Copier après la connexion

Mécanisme d'opération

Dans la boucle d'événements, chaque opération de boucle est appelée un tick. Le modèle de traitement des tâches de chaque tick est relativement complexe, mais les étapes clés sont les suivantes :

  • Exécuter une macro-tâche (récupérez-la dans la file d'attente des événements si elle n'est pas dans la pile)

  • Si une microtâche est rencontrée lors de l'exécution, ajoutez-la à la file d'attente des tâches de la microtâche

  • Macro-tâche exécution Une fois terminé, exécutez immédiatement toutes les microtâches de la file d'attente de microtâches actuelle (exécutées dans l'ordre)

  • Une fois la tâche macro actuelle exécutée, commencez à vérifier le rendu, puis le thread GUI prend en charge le rendu

  • Après l'exécution le rendu est terminé, le thread JS continue de prendre le relais, Démarrez la tâche macro suivante (obtenue à partir de la file d'attente des événements)

comme indiqué :

Que sont les microtâches en javascript ?

[Recommandations associées : Tutoriel d'apprentissage javascript]

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!

Étiquettes associées:
source:php.cn
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal