Qu'est-ce que Boucle d'événements (event loop) ?

Mécanisme par lequel l'environnement d'exécution de JavaScript, sur un seul thread, retire un à un les traitements en attente pour les exécuter. Les traitements déclenchés par un clic, un minuteur ou la fin d'une communication sont placés comme tâches dans une file, et lorsque le code en cours se termine, la boucle d'événements retire la tâche suivante. Les traitements des Promise (microtâches) sont tous exécutés à la fin de chaque tâche, avant la tâche suivante. Si un traitement dure longtemps, le traitement des autres événements et l'affichage de l'écran sont bloqués.

Nom japonais: イベントループ

« Boucle d'événements (event loop) » apparaît dans 1 questions d'entraînement réparties sur 1 thèmes, dont Bases des technologies web.

Domaine: Bases des technologies web

Ordre d'exécution

Par exemple, si après console.log('A') on programme l'affichage de B avec setTimeout et celui de C avec then d'une Promise, puis qu'on exécute console.log('D'), l'affichage se fait dans l'ordre A, D, C, B. Le code synchrone s'exécute d'abord entièrement, puis la microtâche C, et enfin la tâche B. Même avec 0 ms pour setTimeout, l'exécution n'est pas immédiate.

Pourquoi l'écran se fige

Le thread principal du navigateur se charge de l'exécution du JavaScript, du traitement des événements comme les clics et de l'affichage de l'écran. Si l'on exécute d'un seul coup un calcul qui prend plusieurs secondes, la boucle d'événements ne peut pas retirer la tâche suivante pendant ce temps : les boutons ne réagissent plus et l'écran n'est plus mis à jour. On déplace donc les calculs lourds sur un autre thread avec un Web Worker, ou on les découpe en petits morceaux exécutés peu à peu.

Entrées-sorties asynchrones

Pour les communications ou la lecture et l'écriture de fichiers, on ne bloque pas le thread pendant l'attente : on enregistre un traitement à appeler à la fin (une fonction de rappel ou une Promise). Une fois l'opération terminée, ce traitement est placé comme tâche dans la file, et la boucle d'événements l'exécute à son tour. Les environnements d'exécution côté serveur comme Node.js suivent le même principe et gèrent de nombreuses connexions tout en exécutant le JavaScript sur un seul thread.

Questions fréquentes

Un setTimeout de 0 ms s'exécute-t-il immédiatement ?

Non. Une fois le délai indiqué écoulé, le traitement est placé comme tâche dans la file, et il s'exécute après la fin du code en cours et des microtâches déjà en attente. 0 ms signifie « dès que possible, mais après le traitement en cours ».

Peut-on faire des calculs en parallèle en JavaScript ?

Le JavaScript de la page s'exécute lui-même sur un seul thread principal, mais un Web Worker permet d'exécuter des scripts en parallèle sur un autre thread. Un Worker n'ayant pas d'accès direct au DOM, il échange des messages avec le thread principal pour lui transmettre ses résultats.

« Boucle d'événements (event loop) » dans les explications

Questions mentionnant « Boucle d'événements (event loop) » (1)

  1. Lorsqu'on exécute le JavaScript ci-dessus dans un navigateur, quel est l'ordre correct d'affichage des caractères dans la console ?

Termes associés

API REST Code d'état HTTP Cookie (cookie HTTP) CORS (partage des ressources entre origines) DOM (Document Object Model) HTTP (Hypertext Transfer Protocol) JSON (JavaScript Object Notation) JWT (JSON Web Token) Méthode HTTP OAuth

Retour au glossaire