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}
|