Event emitter pattern implemented using a Javascript ES6 class.
class EventEmitter {
events = {};
subscribe = (event, cb) => {
(this.events[event] || (this.events[event] = [])).push(cb);
return {
unsubscribe: () => {
const arr = this.events[event];
const index = arr.indexOf(cb);
if (index < 0) {
return;
}
arr.splice(index, 1);
if (arr.length === 0) {
delete this.events[event];
}
}
};
};
emit = (event, ...rest) => {
(this.events[event] || []).forEach(val => {
val(...rest);
});
};
}
const eventEmitter = new EventEmitter();
const ret1 = eventEmitter.subscribe('test', () => {
console.log('test1');
});
const ret2 = eventEmitter.subscribe('test', () => {
console.log('test2');
});
const ret3 = eventEmitter.subscribe('test3', () => {
console.log('test3');
});
eventEmitter.emit('test'); // test1, test2
ret1.unsubscribe();
ret1.unsubscribe(); // Should still function as expected.
eventEmitter.emit('test'); // test2