La clé est de séparer trois files distinctes et de respecter leur ordre
de traitement :
-
Code synchrone — s'exécute immédiatement, dans l'ordre du fichier.
Seul console.log("A") est synchrone → il s'affiche en premier : A
-
File des microtâches (Promise.then, queueMicrotask) — entièrement
vidée avant la moindre macrotâche, dans l'ordre où les callbacks
ont été MIS EN FILE (pas leur ordre visuel dans le code) :
- Promise.resolve().then(...) met "S" en file en premier
- queueMicrotask(...) met "Y" en file en second
→ S puis Y
-
File des macrotâches (setTimeout) — traitée après que toutes les
microtâches sont vidées, dans l'ordre de programmation :
- premier setTimeout programmé affiche "N"
- second setTimeout programmé affiche "C"
→ N puis C
Ordre final dans la console : A, S, Y, N, C → ASYNC
Le piège : les deux setTimeout sont écrits en premier et en quatrième
position dans le code, ce qui donne l'illusion qu'ils s'exécutent tôt.
En réalité, TOUT code asynchrone attend que la pile d'appels soit vide,
et les microtâches passent toujours avant les macrotâches, même à délai 0.