Conceptos Básicos del Bucle de Eventos
9 ejemplos para empezar con el Bucle de Eventos: 6 básicos y 3 intermedios.
Busca en todas las páginas de la documentación
9 ejemplos para empezar con el Bucle de Eventos: 6 básicos y 3 intermedios.
El código síncrono se ejecuta hasta su finalización antes que cualquier devolución de llamada programada.
console.log('1');
console.log('2');
console.log('3');
// Salida: 1, 2, 3Relacionado: Cómo funciona Node.js - V8 y el hilo único
setTimeout no se ejecuta inmediatamente, sino que encola una devolución de llamada para una iteración posterior del bucle.
console.log('start');
setTimeout(() => console.log('timeout'), 0);
console.log('end');
// start, end, timeout0 ms es un retraso mínimo, no una garantía; el bucle debe despejarse primero.setTimeout y su activación retrasa aún más la devolución de llamada.Relacionado: Temporizadores y Programación - deriva bajo carga
Las microtareas (Promise .then) se vacían antes de la siguiente macrotarea.
console.log('A');
setTimeout(() => console.log('B'), 0);
Promise.resolve().then(() => console.log('C'));
console.log('D');
// A, D, C, BPromise.resolve().then programa una microtarea en la cola de microtareas.Relacionado: Microtareas vs Macrotareas - reglas completas de ordenación
await suspende la función asíncrona y se reanuda a través de microtareas.
async function demo(): Promise<void> {
console.log('before');
await Promise.resolve();
console.log('after');
}
demo();
console.log('sync');
// before, sync, afterawait se ejecuta como una continuación de microtarea.after.await anidadas apilan microtareas; mantén las cadenas poco profundas cuando sea posible.Relacionado: async/await en Node - patrones de manejo de errores
fs.promises programa E/S en libuv y devuelve el control inmediatamente.
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 se ejecuta después de que la lectura del archivo se completa en un hilo en segundo plano.before y after se ejecuta mientras la E/S está en curso.readFileSync bloquearía el bucle; evítalo en las rutas de solicitud.setImmediate se ejecuta en la fase de verificación, después del sondeo de E/S.
import { setImmediate } from 'node:timers';
setTimeout(() => console.log('timeout'), 0);
setImmediate(() => console.log('immediate'));
// El orden varía en el nivel superior; dentro de las devoluciones de llamada de E/S, immediate suele ganarsetTimeout(0) y setImmediate no está garantizado.setImmediate normalmente se ejecuta antes del siguiente temporizador.queueMicrotask o setImmediate sobre setTimeout(fn, 0) para el aplazamiento.Relacionado: Fases de libuv - fases de temporizadores, sondeo, verificación
El trabajo de CPU en el hilo principal detiene todas las demás devoluciones de llamada.
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, ninguna otra solicitud progresa en este proceso.worker_threads o a una cola de trabajos.Relacionado: Detectando el Bloqueo del Bucle de Eventos - mide el retraso en producción
nextTick se ejecuta antes que otras microtareas; úsalo con moderación.
Promise.resolve().then(() => console.log('promise'));
process.nextTick(() => console.log('nextTick'));
// nextTick, promisenextTick se vacía antes que las microtareas de Promise.nextTick recursivo puede agotar la E/S; nunca hagas un bucle con nextTick.queueMicrotask para el aplazamiento a menos que necesites la semántica de nextTick.Relacionado: Microtareas vs Macrotareas - ordenación de nextTick
perf_hooks.eventLoopUtilization informa lo ocupado que está el bucle.
import { eventLoopUtilization } from 'node:perf_hooks';
const start = eventLoopUtilization();
setInterval(() => {
const elu = eventLoopUtilization(start);
console.log('utilization:', elu.utilization.toFixed(3));
}, 5000);Relacionado: Mejores Prácticas del Bucle de Eventos - reglas operativas
Versiones de la pila: Esta página fue escrita para Node.js 24.18.0 (LTS Activo), npm 10+, TypeScript 5.6+, Express 5, Fastify 5 y NestJS 11.
Revisado por Chris St. John·Última actualización: 16 jul 2026