È meglio scrivere codice che non si basa sul tempismo dei callback immediati (come microtask o macrotask), ma per il momento mettiamolo da parte.
setTimeout
mette in coda un macrotask, che, almeno, attende di iniziare fino al termine di tutti i microtask (e microtask che generano). Ecco un esempio:
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');
Il comportamento di una .then
promessa risolta è fondamentalmente diverso dal comportamento di una setTimeout
richiamata immediata : la promessa .then
verrà eseguita per prima, anche se setTimeout
prima è stata messa in coda. Ma solo i browser moderni supportano le promesse. In che modo la speciale funzionalità di un microtask può essere adeguatamente polifillata se Promise
non esiste?
Se provi a imitare un .then
microtask usando setTimeout
, farai la coda di un macrotask, non di un microtask, quindi il malfunzionamento con polifilm .then
non verrà eseguito al momento giusto se un macrotask è già in coda.
C'è una soluzione che utilizza MutationObserver
, ma sembra brutta e non MutationObserver
è per quello che serve. Inoltre, MutationObserver
non è supportato su IE10 e precedenti. Se si desidera mettere in coda un microtask in un ambiente che non supporta nativamente Promesse, ci sono alternative migliori?
(In realtà non sto cercando di supportare IE10 - questo è solo un esercizio teorico su come i microtask possono essere messi in coda senza promesse)
schedule.js
sarà illuminante.