Overview
Implement an EventEmitter class:
on(event, listener)— register listeneroff(event, listener)— remove listeneremit(event, ...args)— call all listeners for eventonce(event, listener)— listener fires only once
Examples
const emitter = new EventEmitter();
emitter.on('data', val => console.log(val));
emitter.emit('data', 42); // logs 42Solution
Reveal solution
class EventEmitter {
constructor() { this.events = new Map(); }
on(event, listener) {
if (!this.events.has(event)) this.events.set(event, []);
this.events.get(event).push(listener);
return this;
}
off(event, listener) {
const listeners = this.events.get(event);
if (listeners) this.events.set(event, listeners.filter(l => l !== listener && l._original !== listener));
return this;
}
emit(event, ...args) {
const listeners = this.events.get(event) || [];
listeners.forEach(l => l(...args));
return this;
}
once(event, listener) {
const wrapper = (...args) => { this.off(event, wrapper); listener(...args); };
wrapper._original = listener;
return this.on(event, wrapper);
}
}event-emitter.js
Event Emitter
mediumcodingJavaScriptDesign Patterns
Overview
Implement an EventEmitter class:
on(event, listener)— register listeneroff(event, listener)— remove listeneremit(event, ...args)— call all listeners for eventonce(event, listener)— listener fires only once
Examples
const emitter = new EventEmitter();
emitter.on('data', val => console.log(val));
emitter.emit('data', 42); // logs 42Solution
Reveal solution
class EventEmitter {
constructor() { this.events = new Map(); }
on(event, listener) {
if (!this.events.has(event)) this.events.set(event, []);
this.events.get(event).push(listener);
return this;
}
off(event, listener) {
const listeners = this.events.get(event);
if (listeners) this.events.set(event, listeners.filter(l => l !== listener && l._original !== listener));
return this;
}
emit(event, ...args) {
const listeners = this.events.get(event) || [];
listeners.forEach(l => l(...args));
return this;
}
once(event, listener) {
const wrapper = (...args) => { this.off(event, wrapper); listener(...args); };
wrapper._original = listener;
return this.on(event, wrapper);
}
}NameTopicDifficulty
103 of 103 problems