class EmitEvent {
constructor() {
this.handlers = {}
}
emit(eventName, ...args){
if (!this.handlers[eventName]) {
return;
}
const eventQueue = this.handlers[eventName].slice(0);
eventQueue.forEach(fn => {
fn(...args)
})
}
on(eventName, fn){
const eventQueue = this.handlers[eventName]
if (eventQueue) {
eventQueue.push(fn);
} else {
this.handlers[eventName] = [fn];
}
}
off(eventName, fn){
const eventQueue = this.handlers[eventName];
if (!eventQueue) {
return;
}
const fnIndex = eventQueue.indexOf(fn);
if (fnIndex > -1) {
eventQueue.splice(fnIndex, 1);
}
}
once(eventName, fn){
const warpFn = (...args) => {
fn(...args);
this.off(eventName, warpFn);
}
this.on(eventName, warpFn)
}
}
const test = (a) => console.log(a);
const eventInstance = new EmitEvent();
eventInstance.on('test', test);
eventInstance.once('test', test);
eventInstance.emit('test', 4455);
console.log('------');
eventInstance.emit('test', 4455);
console