Awaitable Event Emitter
Awaitable Event Emitter is an enhanced version of node.js EventEmitter. It allows you to await emit
methods, unlike fire-and-foget emit
of the native EventEmitter.
Install
npm install @bitr/awaitable-event-emitter
Why do you need this library?
In the native EventEmitter, it is not easy to know when emit
has finished executing async listeners because emit
returns immediately without waiting for promises. In this enhanced version, you can await emitParallel
/emitSerial
that returns Promise.
import { AwaitableEventEmitter } from '@bitr/awaitable-event-emitter';
class Awaitable extends AwaitableEventEmitter {
...
}
const awaitable = new Awaitable();
// Register async functions that returns Promise.
awaitable.on('event', async () => { ... });
awaitable.on('event', async () => { ... });
// Emit an event, execute listeners in parallel, and await until all listeners have finished.
await awaitable.emitParallel('event');
// Or execute listeners in serial order
await awaitable.emitSerial('event');
Implementation
emitParallel
is implemented with Promise.all.
async emitParallel(event: string | symbol, ...args: any[]): Promise<void> {
...
const tasks = listeners.map(l => l.fn(...args))
await Promise.all(tasks);
...
}
emitSerial
is just a for-loop with await inside.
async emitSerial(event: string | symbol, ...args: any[]): Promise<void> {
...
for (const listener of listeners) {
await listener.fn(...args);
}
...
}