xrforge-webxr/lib/AsyncEmitter.js

47 lines
1.2 KiB
JavaScript
Raw Permalink Normal View History

2025-10-23 19:20:50 +02:00
/*
* 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}