Skip to content

Latest commit

 

History

History
92 lines (68 loc) · 3.12 KB

Event-emitter.md

File metadata and controls

92 lines (68 loc) · 3.12 KB

Event-emitter

Usage

import { EventEmitter } from '@mvanvu/ujs';

Trigger and emit event in an easy way

const eventEmitter = new EventEmitter();

// OR create an instance for global scope
// const eventEmitter = EventEmitter.getInstance();

on(name: string, handler: EventHandler['handler'], priority?: number): this

// Trigger an event
eventEmitter.on('greet', (name: string, age: number) => `Hi! my name is ${name}, I'm ${age} years old`);

emit(name: string | string[], ...args: any[]): any[]

// Emit the events
eventEmitter.emit('greet', 'Amy', 16); // It returns: [`Hi! my name is Amy, I'm 16 years old`]

off(name?: string | string[]): this

// Off the events (off all of the events if the name is undefined)
eventEmitter.off('greet');
eventEmitter.emit('greet', 'Amy', 16); // It returns: []

// Emit multi-events
eventEmitter.on('theFirst', () => 'The first event');
eventEmitter.on('theSecond', () => 'The second event');
eventEmitter.emit(['theFirst', 'theSecond']); // It returns: ['The first event', 'The second event']

emitAsync(name: string | string[], ...args: any[]): Promise

// Emit the events in async mode, it will return the result of Promise.all
eventEmitter.on('whoAmI', () => new Promise((resolve) => setTimeout(() => resolve('Hmm! human')))); // Default priority is NORMAL (25)
eventEmitter.on('whoAmI', () => `I'm god!`, EventEmitter.HIGH); // Set the priority is higher (100)
await eventEmitter.emitAsync('whoAmI'); // It returns: [`I'm god!`, 'Hmm! human']

async emitAsyncSequently(name: string | string[], ...args: any[]): Promise<any[]>

// The event will fire in sequentially, the next event will be fired after the previous event fired
let isFirstFired = false;
eventEmitter.on('sequently', () => new Promise((resolve) => setTimeout(() => resolve((isFirstFired = true)), 100)));
eventEmitter.on('sequently', () => new Promise((resolve) => setTimeout(() => resolve(isFirstFired ? 'OK' : 'OOPS!'), 50)));
await eventEmitter.emitAsync('sequently'); // It returns: [true, 'OOPS!']
await eventEmitter.emitAsyncSequently('sequently'); // It returns: [true, 'OK']

open(name?: string | string[]): this

// Re-open the events (open all of the events if the name is undefined)
eventEmitter.open('greet');
eventEmitter.emit('greet', 'Amy', 16); // It returns: [`Hi! my name is Amy, I'm 16 years old`]

remove(name: string | string[]): this

// Remove the events, similar off but the events will be removed and can't re-open (remove all of the events if the name is undefined)
eventEmitter.remove('greet');
eventEmitter.emit('greet', 'Amy', 16); // It returns: []

eventEmitter.open('greet');
eventEmitter.emit('greet', 'Amy', 16); // It returns: []

once(name: string, handler: EventHandler['handler']): this

// Trigger the event in the first time then remove it
eventEmitter.once('onlyOne', () => 'The first time');
eventEmitter.emit('onlyOne'); // It returns: ['The first time']
eventEmitter.emit('onlyOne'); // It returns: []