CodeForge

JavaScript de Cero a Experto / Patrones y observables

Reto: Mi Bolsillo reactivo

Reto35 min60 XP

El examen de arquitecto: montar una mini-arquitectura donde la factory fabrica, el bus comunica y las suscripciones mantienen todo sincronizado — en tres módulos ESM separados, sin DOM y sin framework. Es la maqueta a escala de cómo se organizan las apps grandes; cuando veas RxJS o Zustand, vas a reconocer cada pieza.

Reto

Mi Bolsillo reactivo

Media30 min60 XP(×2 sin mirar la solución)

Qué debes construir

Tres archivos (bus.js, bolsillo.js, index.js) que al correr producen EXACTAMENTE esto:

terminal

[total] $ 18.000

[total] $ 43.000

[alerta] Gasto fuerte: Cine ($ 25.000)

— alerta desuscrita —

[total] $ 135.000

Rechazado: El valor debe ser positivo

[total final] $ 135.000

Requisitos:

  1. bus.js exporta tu crearBus() de la lección 4: Map de tema → lista, publicar(tema, datos), y suscribir(tema, reaccion) que DEVUELVE el comprobante de desuscripción.
  2. bolsillo.js exporta la factory crearBolsillo(bus): movimientos PRIVADOS por closure, getter total (con reduce), y agregar(nombre, valor) que valida (valor > 0 o throw), guarda, y PUBLICA en el bus el tema "gasto" con { nombre, valor, total } — el total ya calculado viaja en el aviso.
  3. index.js arma la app: crea el bus, crea el bolsillo (inyectándole el bus — nota el diseño: el bolsillo no crea su bus, lo RECIBE), y suscribe DOS observadores al tema "gasto": [total] (imprime el total formateado con Intl es-CO) y [alerta] (solo si valor > 20000, guardando su comprobante).
  4. El guion: agrega Almuerzo 18000 y Cine 25000; desuscribe la alerta e imprime la línea de despedida; agrega Mercado 92000 (total avisa, alerta calla); intenta agregar ("Fantasma", -50) atrapando el error; cierra leyendo bolsillo.total directo.
  5. El formateador Intl se crea UNA vez en index.js.

Reglas

  • Tres archivos con import/export — nada de todo-en-uno.
  • El bolsillo NO conoce a sus observadores (solo publica); los observadores NO conocen al bolsillo (solo escuchan el bus).
  • Movimientos privados de verdad: por closure, sin exponer el array.
  • Cero variables globales compartidas entre módulos que no sean los imports.

30:00

Cuando estés listo, arranca el reloj.

Qué sigue

Módulo 13 cerrado: piensas en patrones. El módulo 14 te devuelve al navegador con su caja de APIs modernas — y abre con la que "Mi Bolsillo" lleva pidiendo desde el módulo 8: localStorage, para que los datos POR FIN sobrevivan a la recarga. Además: observers del DOM, hilos aparte con Web Workers, portapapeles, ubicación y el cuaderno de rutas de las SPAs.