NodeJS EventEmitter

3 阅读1分钟
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)
})
}