Bonjour à tous !
Aujourd’hui, comme le titre l’indique ?, je vais parler de la boucle événementielle.
Ce n'est pas un sujet sur lequel les intervieweurs posent souvent directement des questions (je ne me souviens que de deux occasions où ils m'ont demandé d'expliquer la boucle des événements). MAIS, dans la plupart des entretiens, ils posent des questions qui y sont liées. Par exemple :
Il est beaucoup plus facile de répondre à toutes ces questions si vous comprenez comment fonctionne la boucle événementielle.
Je vais être honnête : ce sujet n’est pas mon préféré. Je préfère de loin les questions sur le comportement du code plutôt que d'expliquer comment fonctionne la boucle d'événements pendant 10 minutes d'affilée.?
Plongeons-nous ! ?
## Questions
1. Qu'est-ce que la boucle d'événements ?
2. Exemples
Réponse courte :
La boucle d'événements est responsable de la gestion des tâches asynchrones dans le runtime JavaScript.
Pour être honnête, je ne pense pas que cette réponse soit suffisante pour satisfaire la curiosité d'un intervieweur s'interrogeant sur la boucle événementielle. C’est pourquoi, dans cet article, j’aimerais approfondir ce sujet.
Plus que simplement connaître les concepts, il est important de comprendre comment cela fonctionne. C'est pourquoi j'ai ajouté quelques exemples à la fin.
JavaScript a un runtime basé sur une boucle d'événements, qui est responsable de la gestion des tâches. Chaque langage a un environnement d'exécution unique, et un point important à noter est que JavaScript est mono-thread.
Single-thread signifie que JavaScript ne peut gérer qu'une seule tâche à la fois. C'est pourquoi la boucle d'événements est si essentielle en JavaScript ; cela permet de gérer les tâches efficacement malgré cette limitation d'un seul thread.
Pour mieux comprendre la boucle événementielle, examinons d'abord ses principaux composants :
La pile d'appels est une structure de données qui assure le suivi des fonctions que nous appelons. Vous pouvez le considérer comme une pile de plaques : lorsqu’une fonction est appelée, elle est ajoutée à la pile, et lorsqu’elle est terminée, elle est supprimée de la pile.
La pile d'appels fonctionne selon le principe LIFO (Last-In-First-Out), ce qui signifie que JavaScript exécute les fonctions dans l'ordre dans lequel elles sont empilées : de l'élément le plus haut vers le bas, un à l'autre. une fois (rappelez-vous, JavaScript est monothread).
Dans le runtime JavaScript, nous avons des files d'attente qui contiennent des listes de tâches à traiter. Les tâches dans ces files d'attente attendent que la pile d'appels soit vide.
File d'attente des tâches (ou file d'attente de rappel) : Cette file d'attente stocke des tâches telles que les appels setTimeout() et setInterval(). Les tâches ici sont traitées une fois que la pile d'appels est vide et après que toutes les tâches de la file d'attente Microtask ont été traitées. Découvrez plus d'exemples de tâches stockées dans cette file d'attente sur MDN.
File d'attente des microtâches : Cette file d'attente a la priorité sur la file d'attente des tâches. Il comprend des microtâches telles que les rappels Promise et des fonctions asynchrones comme process.nextTick() et des fonctions asynchrones.
La Task Queue fonctionne sur une base FIFO (First-In-First-Out), ce qui signifie que les tâches sont traitées dans l'ordre dans lequel elles sont ajoutées, mais seulement après la microtâche. La file d'attente est vide.
La boucle d'événements est un mécanisme qui gère l'exécution de code asynchrone. Il observe la pile d'appels et les coordonnées entre la pile d'appels et les files d'attente (Task Queue et Microtask Queue) pour assurer le bon fonctionnement du code.
Parcourons le processus de boucle d'événements étape par étape. Reportez-vous à l'image ci-dessous pour une représentation visuelle.
Dans cet exemple :
En suivant cet ordre—Call Stack, puis Microtask Queue et enfin Task Queue—la boucle d'événements aide JavaScript à gérer efficacement le code asynchrone, même dans son environnement monothread.
Maintenant que nous comprenons comment fonctionne la boucle d'événements et comment les tâches sont hiérarchisées, regardons quelques exemples.
const a = new Promise(function showA(resolve){ console.log('A'); resolve('B'); }); setTimeout(function showC() { console.log('C'); }, 0); a.then(function showB(b) { console.log(b); }); const d = function showD() { console.log('D'); }; d();
Avant de continuer, essayez de réfléchir à l'ordre de sortie.
✨Qu'attendez-vous que ce soit ?✨
Décomposons chaque partie du code pour comprendre pourquoi nous obtenons ce résultat.
1. Créer la promesse
const a = new Promise(function showA(resolve) { console.log('A'); resolve('B'); });
2. setTimeout Appel
setTimeout(function showC() { console.log('C'); }, 0);
3. a.puis rappel
const a = new Promise(function showA(resolve){ console.log('A'); resolve('B'); }); setTimeout(function showC() { console.log('C'); }, 0); a.then(function showB(b) { console.log(b); }); const d = function showD() { console.log('D'); }; d();
4. Définir d
const a = new Promise(function showA(resolve) { console.log('A'); resolve('B'); });
5. Appel de d()
setTimeout(function showC() { console.log('C'); }, 0);
Ordre de sortie final :
a.then(function showB(b) { console.log(b); });
GIF pour référence
Exemple interactif
const d = function showD() { console.log('D'); };
Encore une fois, prenez un moment pour réfléchir à l'ordre de sortie.
✨Qu'attendez-vous que ce soit ?✨
C'est parti pour l'explication...
1. Journalisation "Démarrer!"
d();
A D B C
3. Promesse de résolution
console.log("Start!"); setTimeout(function showTimeout() { console.log("Timeout!"); }, 0); Promise.resolve("Promise!") .then(function showPromise(res) { console.log(res); }); console.log("End!");
4. Journalisation "Fin!"
console.log("Start!");
Ordre de sortie final :
setTimeout(function showTimeout() { console.log("Timeout!"); }, 0);
GIF pour référence
Exemple interactif
Ce chapitre n'était pas trop long, mais j'espère que ces exemples vous ont aidé à comprendre comment fonctionne la boucle d'événements.
Je recommande fortement d'expérimenter la page interactive pour analyser d'autres exemples. Jouer sur cette page peut rendre beaucoup plus facile la compréhension de la boucle d'événements en action.
Merci beaucoup pour tout l'amour sur mes messages précédents !
A la semaine prochaine ! ?
Au revoir
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!