problems(js): add “2694. Event Emitter”
Signed-off-by: Matej Focko <mfocko@redhat.com>
This commit is contained in:
parent
0a4eda37ee
commit
efeafcae88
1 changed files with 39 additions and 0 deletions
39
problems/js/event-emitter.js
Normal file
39
problems/js/event-emitter.js
Normal file
|
@ -0,0 +1,39 @@
|
|||
class EventEmitter {
|
||||
constructor() {
|
||||
this.mapping = new Map();
|
||||
}
|
||||
|
||||
subscribe(event, cb) {
|
||||
if (!this.mapping.has(event)) {
|
||||
this.mapping.set(event, new Array());
|
||||
}
|
||||
|
||||
this.mapping.get(event).push(cb);
|
||||
|
||||
return {
|
||||
unsubscribe: () => {
|
||||
this.mapping.set(event, this.mapping.get(event).filter(s => s !== cb));
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
emit(event, args = []) {
|
||||
if (!this.mapping.has(event)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return this.mapping.get(event).map(cb => cb(...args));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* const emitter = new EventEmitter();
|
||||
*
|
||||
* // Subscribe to the onClick event with onClickCallback
|
||||
* function onClickCallback() { return 99 }
|
||||
* const sub = emitter.subscribe('onClick', onClickCallback);
|
||||
*
|
||||
* emitter.emit('onClick'); // [99]
|
||||
* sub.unsubscribe(); // undefined
|
||||
* emitter.emit('onClick'); // []
|
||||
*/
|
Loading…
Reference in a new issue