Node.js
Events y EventEmitter
Modelo de eventos en Node.js mediante EventEmitter: registro y eliminación de listeners, eventos de error, asincronía, memoria y diseño de APIs observables.
- Última actualización
- Actualizada
- Nivel
- Fundamentos
Node.js
Modelo de eventos en Node.js mediante EventEmitter: registro y eliminación de listeners, eventos de error, asincronía, memoria y diseño de APIs observables.
import { EventEmitter } from "node:events";
const bus = new EventEmitter();
bus.on("order.created", (order) => {
console.log(order.id);
});
bus.emit("order.created", { id: "o1" });emit devuelve después de ejecutar listeners síncronos.
const listener = () => console.log("ready");
bus.once("ready", listener);
bus.off("ready", listener);Conserva referencias cuando necesites remover listeners.
Un EventEmitter que emite error sin listener puede terminar el proceso.
bus.on("error", (error) => {
console.error(error);
});No captures un error solo para ignorarlo. Decide si se puede continuar, reintentar o cerrar.
Añadir listeners repetidamente sin removerlos retiene callbacks y lo que capturan. La advertencia de maxListeners es una señal de diseño o cleanup pendiente; aumentar el límite no corrige la fuga.
bus.on("data", async (value) => {
await save(value);
});
bus.emit("data", payload);emit no espera esa Promise. Si el emisor necesita saber cuándo terminó el trabajo, usa un contrato basado en Promise o un coordinador explícito.
Algunas APIs permiten consumir eventos como iteración asíncrona, útil cuando quieres backpressure o cancelación más explícita.
Para APIs de larga duración, acepta una señal y remueve listeners al abortar.
signal.addEventListener("abort", cleanup, { once: true });No los conviertas en arquitectura universal: demasiados eventos implícitos dificultan trazar flujo y errores.
error.emit es síncrono.error tiene semántica especial.¿Por qué await emitter.emit() no espera listeners async?
Porque emit retorna un booleano, no una Promise que combine los resultados de listeners.
Streams y backpressure utiliza eventos, buffers y recursos para mover datos de forma controlada.