/* * async Event Emitter * * // Example usage * const emitter = new AsyncEmitter(); * * // Register some async listeners * emitter.on("data", async (msg) => { * console.log("Listener 1 starting..."); * await new Promise((r) => setTimeout(r, 1000)); * console.log("Listener 1 done:", msg); * }); * * emitter.on("data", async (msg) => { * console.log("Listener 2 starting..."); * await new Promise((r) => setTimeout(r, 500)); * console.log("Listener 2 done:", msg); * }); * * (async () => { * console.log("Emitting..."); * await emitter.emit("data", "Hello async world!"); * console.log("All listeners finished."); * })(); */ class AsyncEmitter { constructor() { this.listeners = new Map(); } on(event, listener) { if (!this.listeners.has(event)) this.listeners.set(event, []); this.listeners.get(event).push( listener ); } async emit(event, ...args) { const listeners = this.listeners.get(event) || []; if( document.location.hostname == 'localhost' ) console.info(`emit(${event})`) for (const fn of listeners) { await fn(...args); // <-- Waits for each listener to finish } } } export {AsyncEmitter}