46 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			46 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/* 
 | 
						|
 * 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}
 |