TS编写发布订阅模式

 

interface PubSubType {
  events: { [key: string]: { name: string, once: boolean, cb: Function }[] }
  on(name: string, cb: Function): void
  once(name: string, cb: Function): void
  emit(name: string, ...arg: Array<any>): void
  off(name: string, cb: Function): void
}
class PubSub implements PubSubType {
  events: { [key: string]: { name: string, once: boolean, cb: Function }[] }
  constructor() {
    this.events = {}
  }
  private eventsOnApi(this: PubSubType, name: string, cb: Function, once: boolean = false) {
    const list = this.events[name] || [];
    list.push({ name, cb, once })
    this.events[name] = list
  }
  on(name: string, cb: Function): void {
    this.eventsOnApi(name, cb)
  }
  once(name: string, cb: Function): void {
    this.eventsOnApi(name, cb, true)
  }
  emit(name: string, ...arg: Array<any>): void {
    const list = this.events[name];
    list && list.forEach(item => {
      if (item.once) {
        item.cb.apply(this, arg)
        this.off(name, item.cb)
      } else {
        item.cb.apply(this, arg)
      }
    })
  }
  off(name: string, cb: Function): void {
    const list = this.events[name];
    if (!list) return
    const fileList = list.filter(item => item.cb !== cb)
    this.events[name] = fileList
  }
}

 

posted @ 2022-08-10 14:19  。吃什么  阅读(74)  评论(0编辑  收藏  举报