É melhor escrever um código que não dependa do tempo de retornos de chamada imediatos (como microtasks vs macrotasks), mas vamos deixar isso de lado por enquanto.
setTimeout
enfileira uma macrotask, que, no mínimo, espera para iniciar até que todas as microtasks (e microtasks que elas geram) terminem. Aqui está um exemplo:
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');
O comportamento de uma .then
Promessa resolvida é fundamentalmente diferente do comportamento de um setTimeout
retorno de chamada imediato - a Promessa .then
será executada primeiro, mesmo que tenha setTimeout
sido colocada na fila primeiro. Mas apenas navegadores modernos suportam promessas. Como a funcionalidade especial de uma microtask pode ser preenchida corretamente se Promise
não existe?
Se você tentar imitar uma .then
microtask de uma usando setTimeout
, você estará enfileirando uma macrotask, não uma microtask, para que o mal preenchido com polietileno .then
não seja executado no momento certo se uma macrotask já estiver na fila.
Existe uma solução em uso MutationObserver
, mas parece feia e não MutationObserver
é para isso. Além disso, MutationObserver
não é suportado no IE10 e versões anteriores. Se alguém deseja enfileirar uma microtask em um ambiente que não oferece suporte nativo ao Promises, existem alternativas melhores?
(Na verdade, não estou tentando oferecer suporte ao IE10 - este é apenas um exercício teórico sobre como as microtasks podem ser enfileiradas sem promessas)
schedule.js
será esclarecedor.