Noções Básicas do Event Loop
9 exemplos para você começar com o Event Loop - 6 básicos e 3 intermediários.
Busque em todas as páginas da documentação
9 exemplos para você começar com o Event Loop - 6 básicos e 3 intermediários.
O código síncrono executa até a conclusão antes de qualquer callback agendado.
console.log('1');
console.log('2');
console.log('3');
// Saída: 1, 2, 3Relacionado: Como o Node.js Funciona - V8 e a thread única
setTimeout não executa imediatamente - ele enfileira um callback para uma iteração posterior do loop.
console.log('start');
setTimeout(() => console.log('timeout'), 0);
console.log('end');
// start, end, timeout0 ms é um atraso mínimo, não uma garantia - o loop precisa ser limpo primeiro.setTimeout e sua execução atrasa ainda mais o callback.Relacionado: Timers e Agendamento - drift sob carga
Microtasks (Promise .then) são esvaziadas antes da próxima macrotask.
console.log('A');
setTimeout(() => console.log('B'), 0);
Promise.resolve().then(() => console.log('C'));
console.log('D');
// A, D, C, BPromise.resolve().then agenda uma microtask na fila de microtasks.Relacionado: Microtasks vs Macrotasks - regras completas de ordenação
await suspende a função assíncrona e retoma via microtasks.
async function demo(): Promise<void> {
console.log('before');
await Promise.resolve();
console.log('after');
}
demo();
console.log('sync');
// before, sync, afterawait é executado como uma continuação de microtask.after.await aninhadas empilham microtasks - mantenha as cadeias rasas quando possível.Relacionado: async/await no Node - padrões de tratamento de erros
fs.promises agenda I/O no libuv e retorna o controle imediatamente.
import { readFile } from 'node:fs/promises';
console.log('before read');
readFile('package.json', 'utf8').then((data) => {
console.log('read', data.length, 'bytes');
});
console.log('after read');.then é executado após a leitura do arquivo ser concluída em uma thread em segundo plano.before e after é executado enquanto o I/O está em andamento.readFileSync bloquearia o loop - evite-o em caminhos de requisição.setImmediate executa na fase de verificação (check), após a sondagem de I/O.
import { setImmediate } from 'node:timers';
setTimeout(() => console.log('timeout'), 0);
setImmediate(() => console.log('immediate'));
// A ordem varia no nível superior; dentro de callbacks de I/O, immediate geralmente vencesetTimeout(0) e setImmediate não é garantida.setImmediate normalmente executa antes do próximo timer.queueMicrotask ou setImmediate em vez de setTimeout(fn, 0) para adiamento.Relacionado: Fases do libuv - fases de timers, poll, check
Trabalho de CPU na thread principal paralisa todos os outros callbacks.
import { createServer } from 'node:http';
function block(ms: number): void {
const end = Date.now() + ms;
while (Date.now() < end) { /* spin */ }
}
createServer((req, res) => {
if (req.url === '/block') block(3000);
res.end('ok');
}).listen(3000);block executa, nenhuma outra requisição progride neste processo.worker_threads ou uma fila de jobs.Relacionado: Detectando Bloqueio do Event Loop - meça o lag em produção
nextTick executa antes de outras microtasks - use com moderação.
Promise.resolve().then(() => console.log('promise'));
process.nextTick(() => console.log('nextTick'));
// nextTick, promisenextTick é esvaziada antes das microtasks de Promise.nextTick recursivo pode "matar de fome" o I/O - nunca faça loop com nextTick.queueMicrotask para adiamento, a menos que você precise da semântica de nextTick.Relacionado: Microtasks vs Macrotasks - ordenação de
nextTick
perf_hooks.eventLoopUtilization relata o quão ocupado o loop está.
import { eventLoopUtilization } from 'node:perf_hooks';
const start = eventLoopUtilization();
setInterval(() => {
const elu = eventLoopUtilization(start);
console.log('utilization:', elu.utilization.toFixed(3));
}, 5000);Relacionado: Melhores Práticas do Event Loop - regras operacionais
Versões da Stack: Esta página foi escrita para Node.js 24.18.0 (Active LTS), npm 10+, TypeScript 5.6+, Express 5, Fastify 5 e NestJS 11.
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026