设计模式 - 订阅发布

113 阅读1分钟

发布:发动某个事件,执行一系列操作(把该事件对应的数组中的函数全部执行一遍)。
订阅:监听某个事件,该事件发生时,做一些事情(执行一个函数)。

代码示例:
const eventHub = {
  map: {
    // click: [f1 , f2]
  },
  on(name, fn){
    if(this.map[name])
      this.map[name].push(fn)
    else
      this.map[name] = [fn]
  },
  emit(name, data){
    const q = this.map[name]
    if(q)
      q.forEach(f => f(data))
  },
  off(name, fn){
    const q = this.map[name]
    if(q) {
      const index = q.indexOf(fn)
      if(index >= 0)
        q.splice(index, 1)
    }
  }
}

eventHub.on('click', console.log)
eventHub.on('click', console.error)

setTimeout(() => eventHub.emit('click', 'frank'), 3000)