class EventEmitter {
constructor() {
this.listeners = {};
}
on(eventName, fn) {
this.listeners[eventName] = this.listeners[eventName] || [];
this.listeners[eventName].push(fn);
}
emit(eventName, ...args) {
const listeners = this.listeners[eventName];
listeners && listeners.forEach(lis => lis.apply(this, args));
}
once(eventName, fn) {
const _fn = (...args) => {
fn.apply(this, args);
this.remove(eventName, _fn);
}
this.on(eventName, _fn);
}
remove(eventName, fn) {
const listeners = this.listeners[eventName];
if (listeners) {
this.listeners[eventName] = listeners.filter(lis => lis != fn);
} else {
delete this.listeners[eventName];
}
}
}