La boucle d’événements
Fait partie de la section Les bases de Node.js du Journey Node.js de Coddy. Leçon 26 sur 33.
Les callbacks et les promesses s’exécutent plus tard, et les bogues se cachent dans l’incertitude quant au moment exact.
Node exécute d’abord tout le code synchrone jusqu’à la fin. Ensuite, il exécute les microtâches : les callbacks des promesses et les fonctions transmises à queueMicrotask. Ce n’est qu’après viennent les minuteries. setTimeout(fn, ms) exécute fn une seule fois, après ms millisecondes. Même setTimeout(fn, 0) attend que les microtâches soient terminées.
setTimeout(() => console.log('C timer'), 0);
Promise.resolve().then(() => console.log('B promise'));
console.log('A sync');
// A sync, B promise, C timerUn délai de 0 signifie dès que possible après les microtâches, jamais avant. Les minuteries se déclenchent dans l’ordre de leur délai ; en cas de délais égaux, celle qui a été définie en premier se déclenche en premier.
Défi
FacileNode exécute votre code dans un ordre fixe. D’abord, les lignes normales, puis les microtâches telles que les rappels de promesse, puis les temporisateurs. Utilisez cet ordre pour afficher quatre lignes dans l’ordre numérique sans les déplacer.
order.js affiche ses quatre lignes de 4 à 1. Ne déplacez pas et ne réorganisez pas les lignes. À la place, enveloppez-en trois afin qu’elles s’exécutent plus tard.
- Laissez
console.log('1 sync')tel quel. Le code normal s’exécute en premier. - Enveloppez la ligne
2 microtaskdansqueueMicrotask, afin qu’elle s’exécute juste après le code normal. - Enveloppez chacune des lignes
3 timeoutet4 timeout laterdans son propresetTimeout.setTimeout(fn, ms)exécute la fonctionfnune fois,msmillisecondes plus tard. La ligne 4 est définie avant la ligne 3 : elle doit donc avoir un délai plus long.
node order.js affiche ensuite :
1 sync
2 microtask
3 timeout
4 timeout laterEssayez : avant de l’exécuter, devinez l’ordre. Puis appuyez sur « Jouer » ; le terminal affiche $ node order.js. Ensuite, donnez un délai de 0 aux deux temporisateurs et exécutez à nouveau : 4 timeout later s’affiche maintenant avant 3 timeout, car lorsque les délais sont égaux, le temporisateur défini en premier s’exécute en premier. Remettez le délai le plus long sur la ligne 4 avant d’appuyer sur « Vérifier ».
Essayez vous-même
// Faites en sorte que ces lignes s’affichent dans l’ordre des numéros sans les déplacer.
// Placez-les plutôt dans queueMicrotask et setTimeout.
console.log('4 timeout later');
console.log('3 timeout');
console.log('2 microtask');
console.log('1 sync');
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Les bases de Node.js
1Exécuter JavaScript avec Node
Bonjour, NodeLire la commandeArguments de ligne de commandeCommandes5Événements, entrées et packages
Écouter avant d’émettreÉmetteurs d’événementsLire les entréesEntraînez-vous par vous-même : Playground Express