1
// 1. Clase EventEmitter Genérica
class EventEmitter {
#eventos = new Map();
// Suscribir un callback a un evento
on(nombreEvento, callback) {
if (!this.#eventos.has(nombreEvento)) {
this.#eventos.set(nombreEvento, new Set());
}
this.#eventos.get(nombreEvento).add(callback);
}
// Desuscribir
off(nombreEvento, callback) {
if (this.#eventos.has(nombreEvento)) {
this.#eventos.get(nombreEvento).delete(callback);
}
}
// Disparar evento a todos los observadores
emit(nombreEvento, datos) {
if (!this.#eventos.has(nombreEvento)) return;
const observadores = this.#eventos.get(nombreEvento);
for (const callback of observadores) {
callback(datos);
}
}
}
// 2. Modelo de Tienda que Hereda de EventEmitter
class TiendaOnline extends EventEmitter {
constructor() {
super();
this.pedidos = [];
}
crearPedido(cliente, producto, total) {
const pedido = {
id: "PED-" + Math.floor(1000 + Math.random() * 9000),
cliente,
producto,
total,
fecha: new Date().toLocaleTimeString()
};
this.pedidos.push(pedido);
console.log(`\n🛒 [Tienda] Nuevo pedido generado: #${pedido.id}`);
// Notificar a todos los módulos observadores suscritos:
this.emit("pedido_creado", pedido);
}
}
// ==========================================
// OBSERVADORES DESACOPLADOS (Módulos de la App)
// ==========================================
const moduloEmail = (pedido) => {
console.log(`📧 [Servicio Email] Enviando confirmación de compra a: ${pedido.cliente}`);
};
const moduloAlmacen = (pedido) => {
console.log(`📦 [Inventario] Descontando 1 unidad de "${pedido.producto}" del stock.`);
};
const moduloFacturacion = (pedido) => {
console.log(`🧾 [Facturación] Factura generada por un total de $${pedido.total.toFixed(2)} USD.`);
};
// ==========================================
// PRUEBA EN EL SANDBOX
// ==========================================
const amazonClone = new TiendaOnline();
// Suscripción de observadores al evento "pedido_creado"
amazonClone.on("pedido_creado", moduloEmail);
amazonClone.on("pedido_creado", moduloAlmacen);
amazonClone.on("pedido_creado", moduloFacturacion);
// Disparo de eventos: Cada observador reacciona de forma independiente
amazonClone.crearPedido("Carlos Mendoza", "MacBook Pro M3", 2499.00);
amazonClone.crearPedido("Valeria Torres", "Mouse MX Master 3S", 99.90);
Haz clic para editar este código