Menu
CoddyTech

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 timer

Un 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.

challenge icon

Défi

Facile

Node 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.

  1. Laissez console.log('1 sync') tel quel. Le code normal s’exécute en premier.
  2. Enveloppez la ligne 2 microtask dans queueMicrotask, afin qu’elle s’exécute juste après le code normal.
  3. Enveloppez chacune des lignes 3 timeout et 4 timeout later dans son propre setTimeout. setTimeout(fn, ms) exécute la fonction fn une fois, ms millisecondes 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 later

Essayez : 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');
quiz iconTestez-vous

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

Entraînez-vous par vous-même : Playground Express