MicroTask e MacroTask | Javascript
- MicroTask e MacroTask | Javascript
🔁 O que é o Event Loop?
O Event Loop é o mecanismo que permite ao JavaScript (que é single-threaded) lidar com operações assíncronas sem bloquear a execução. Ele gerencia duas filas principais:
-
Microtask Queue (Fila de Microtarefas)
Executada logo após a pilha de execução principal estar vazia, antes de qualquer Macrotask. -
Macrotask Queue (ou simplesmente Task Queue)
Executada depois que todas as Microtasks pendentes forem processadas.
🧠 Diferença entre Microtask e Macrotask
| Tipo de Tarefa | Exemplos | Quando é Executada |
|---|---|---|
| Microtask | Promise.then, queueMicrotask, MutationObserver, process.nextTick() | Imediatamente após o código síncrono e antes da próxima Macrotask |
| Macrotask | setTimeout, setInterval, setImmediate, eventos de UI, I/O, WebSockets | Depois de todas as Microtasks pendentes serem resolvidas |
🧪 Analisando seu exemplo passo a passo
Promise.resolve().then(() => console.log('promise-1'));
console.log('console-1');
setTimeout(() => console.log('set-timeout-1'), 0);
Promise.resolve().then(() => console.log('promise-2'));
console.log('console-2');
setTimeout(() => console.log('set-timeout-2'), 0);
Promise.resolve().then(() => console.log('promise-3'));
Fase 1: Execução do código síncrono (Main Stack)
Promise.resolve().then(...)→ jogapromise-1na Microtask Queueconsole.log('console-1')→ imprime agorasetTimeout(...)→ jogaset-timeout-1na Macrotask QueuePromise.resolve().then(...)→ jogapromise-2na Microtask Queueconsole.log('console-2')→ imprime agorasetTimeout(...)→ jogaset-timeout-2na Macrotask QueuePromise.resolve().then(...)→ jogapromise-3na Microtask Queue
Fase 2: Execução da Microtask Queue
Em ordem:
promise-1promise-2promise-3
Fase 3: Execução da Macrotask Queue
set-timeout-1set-timeout-2
🧪 Resultado final:
console-1
console-2
promise-1
promise-2
promise-3
set-timeout-1
set-timeout-2
🤔 Por que setTimeout(..., 0) não executa imediatamente?
Porque o setTimeout sempre entra na Macrotask Queue, que espera todas as Microtasks terminarem primeiro. O tempo 0ms não é garantia de execução imediata — apenas define o mínimo tempo de espera antes da execução da tarefa.
🧵 Curiosidade: process.nextTick() (Node.js)
No Node.js, process.nextTick() é ainda mais prioritário que Microtasks padrão (Promise.then). Ele é executado antes mesmo da fila de Microtasks, o que pode causar starvation se abusado.