"use strict"; class Event { constructor() { this.handlers = new Map(); this.count = 0; } subscribe(handler) { this.handlers.set(++this.count, handler); return this.count; } unsubscribe(idx) { this.handlers.delete(idx); } notify(sender, args) { this.handlers.forEach((func, idx) => func(sender, args)); } } class DownloadManager extends Event { constructor() { super(); } downloadUrl(url) { // Simulador de descarga let progress = 0; let intervalId = setInterval(() => { if (progress >= 10) { clearInterval(intervalId); this.notify(this, { success: true, progress: progress * 10, url }); } else { this.notify(this, { success: false, progress: progress * 10, url }); } progress++; }, 500); } } class DownloadFileProcess { update = (sender, args) => { console.log( `DownloadFileProcess: Descargando ${args.url}: ${args.progress}%` ); }; } class DownloadFileCompleted { update = (sender, args) => { if (args.success) { console.log( `DownloadFileCompleted: ${args.url} descargada correctamente` ); } }; } /* Imaginemos que tenemos una servicio de descarga de datos en segundo plano, Entonces me gustaría saber el progreso de la descarga y cuando esté finalizado */ // Subject let downloadManager = new DownloadManager(); // Observador let downloadFileProcess = new DownloadFileProcess(); let downloadFileCompleted = new DownloadFileCompleted(); downloadManager.subscribe(downloadFileProcess.update); downloadManager.subscribe(downloadFileCompleted.update); downloadManager.downloadUrl("http://hola.com"); /* DownloadFileProcess: Descargando http://hola.com: 0% DownloadFileProcess: Descargando http://hola.com: 10% DownloadFileProcess: Descargando http://hola.com: 20% DownloadFileProcess: Descargando http://hola.com: 30% DownloadFileProcess: Descargando http://hola.com: 40% DownloadFileProcess: Descargando http://hola.com: 50% DownloadFileProcess: Descargando http://hola.com: 60% DownloadFileProcess: Descargando http://hola.com: 70% DownloadFileProcess: Descargando http://hola.com: 80% DownloadFileProcess: Descargando http://hola.com: 90% DownloadFileProcess: Descargando http://hola.com: 100% DownloadFileCompleted: http://hola.com descargada correctamente */