Saber2pr's Blog

PublishAndSubscribe

export class Dispatcher {
  private constructor() { }
  public static instance = new Dispatcher()
  private events: object = {}

  public addEventListener(type: string, listener: Function) {
    const listeners = this.events[type] || []
    listeners.push(listener)
    this.events[type] = listeners
  }

  public removeEventListener(type: string, listener: Function) {
    const listeners = this.events[type] || []
    const index = listeners.indexOf(listener)
    listeners.splice(index, 1)
  }

  public dispatch(type: string, message: any) {
    const listeners = this.events[type] || []
    for (const listener of listeners) {
      listener(message)
    }
  }
}

Stripped down version (js):

const Eve = {
  events: {},
  on(type, listener) {
    const listeners = this.events[type] || []
    listeners.push(listener)
    this.events[type] = listeners
  },
  off(type, listener) {
    const listeners = this.events[type] || []
    const index = listeners.indexOf(listener)
    listeners.splice(index, 1)
  },
  emit(type, message) {
    const listeners = this.events[type] || []
    // 这里看情况,事件列表太长就不要slice
    for (const listener of listeners.slice()) {
      listener(message)
    }
  }
}