Listo (Ctrl + Enter para ejecutar) Bootcamp Fullstack »
app.js
Tab = 4 espacios
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
Vista Previa
Consola Virtual JavaScript