Il est préférable d'écrire du code qui ne dépend pas de la synchronisation des rappels immédiats (comme les microtâches contre les macrotâches), mais mettons cela de côté pour le moment.
setTimeoutmet en file d'attente une macrotâche, qui, au minimum, attend de démarrer jusqu'à ce que tous les microtâches (et les microtâches qu'ils génèrent) se terminent. Voici un exemple:
console.log('Macrotask queued');
setTimeout(function() {
console.log('Macrotask running');
});
Promise.resolve()
.then(function() {
console.log('Microtask running');
});
console.log('Microtask queued');
console.log('Last line of script');
Le comportement d'un .thensur une promesse résolue est fondamentalement différent du comportement d'un setTimeoutrappel immédiat - la promesse .thens'exécutera en premier, même si le a setTimeoutété mis en file d'attente en premier. Mais seuls les navigateurs modernes prennent en charge Promises. Comment la fonctionnalité spéciale d'une microtâche peut-elle être correctement remplie si elle Promisen'existe pas?
Si vous essayez d'imiter une .thenmicrotâche en utilisant un setTimeout, vous allez mettre en file d'attente une macrotâche, pas une microtâche, de sorte que la mauvaise polyfonction .thenne fonctionnera pas au bon moment si une macrotâche est déjà en file d'attente.
Il y a une solution à utiliser MutationObserver, mais elle a l'air moche, et ce n'est pas MutationObserverpour ça . En outre, MutationObservern'est pas pris en charge sur IE10 et versions antérieures. Si l'on veut mettre en file d'attente une microtâche dans un environnement qui ne prend pas en charge nativement Promises, existe-t-il de meilleures alternatives?
(Je n'essaie pas réellement de prendre en charge IE10 - ce n'est qu'un exercice théorique sur la façon dont les microtâches peuvent être mises en file d'attente sans promesses)
schedule.jssera instructif.