class MyEventEmitter {
constructor() {
this.events = Object.create(null);
}
on(event, listener) {
if (!this.events[event]) {
this.events[event] = [];
}
this.events[event].push(listener);
return this;
}
emit(event, ...args) {
const listeners = this.events[event];
if (!listeners) return false;
for (const listener of [...listeners]) {
listener(...args);
}
return true;
}
off(event, listener) {
const listeners = this.events[event];
if (!listeners) return this;
this.events[event] = listeners.filter(
(fn) => fn !== listener && fn._original !== listener
);
if (this.events[event].length === 0) {
delete this.events[event];
}
return this;
}
once(event, listener) {
const wrapper = (...args) => {
this.off(event, wrapper);
listener(...args);
};
wrapper._original = listener;
return this.on(event, wrapper);
}
}
EventEmitter+Promise封装
function waitForEvent(emitter, eventName){
return new Promise((resolve,reject)=>{
function onSuccess(...args){
cleanup()
resolve(args)
}
function onError(err){
cleanup()
reject(err)
}
function cleanup(){
emitter.off(eventName,onSuccess)
emitter.off('error',onError)
}
emitter.on(eventName,onSuccess)
emitter.on('error'onError)
})
}