Skip to main content

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:

  1. Microtask Queue (Fila de Microtarefas)
    Executada logo após a pilha de execução principal estar vazia, antes de qualquer Macrotask.

  2. Macrotask Queue (ou simplesmente Task Queue)
    Executada depois que todas as Microtasks pendentes forem processadas.


🧠 Diferença entre Microtask e Macrotask

Tipo de TarefaExemplosQuando é Executada
MicrotaskPromise.then, queueMicrotask, MutationObserver, process.nextTick()Imediatamente após o código síncrono e antes da próxima Macrotask
MacrotasksetTimeout, setInterval, setImmediate, eventos de UI, I/O, WebSocketsDepois 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(...) → joga promise-1 na Microtask Queue
  • console.log('console-1') → imprime agora
  • setTimeout(...) → joga set-timeout-1 na Macrotask Queue
  • Promise.resolve().then(...) → joga promise-2 na Microtask Queue
  • console.log('console-2') → imprime agora
  • setTimeout(...) → joga set-timeout-2 na Macrotask Queue
  • Promise.resolve().then(...) → joga promise-3 na Microtask Queue

Fase 2: Execução da Microtask Queue

Em ordem:

  • promise-1
  • promise-2
  • promise-3

Fase 3: Execução da Macrotask Queue

  • set-timeout-1
  • set-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.