1.0.3 • Published 6 years ago

@bitr/awaitable-event-emitter v1.0.3

Weekly downloads
153
License
MIT
Repository
github
Last release
6 years ago

Build Status Coverage Status npm version

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.

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);
  }
  ...
}