emitter remove
by Artem
Babel + JSX
'use strict';
function makeSubscription(fn, listeners, eventType) {
const subscription = function(...args) {
return fn.apply(this, args);
};
subscription.remove = function() {
const idx = listeners[eventType].find(listener => listener === fn);
listeners[eventType].splice(idx, 1);
};
return subscription;
}
const emitter = {
listeners: {},
addListener(eventType, callback) {
const subscription = makeSubscription(callback, this.listeners, eventType);
this.listeners[eventType] ?
this.listeners[eventType].push(subscription) :
this.listeners[eventType] = [subscription];
return subscription;
},
emit(eventType) {
this.listeners[eventType].forEach(listener => listener());
}
};
const cb1 = emitter.addListener('change', function() {
console.log('hello');
});
const cb2 = emitter.addListener('change', function() {
console.log('bye');
});
emitter.emit('change');
cb1.remove();
emitter.emit('change');