手写发布订阅

46 阅读1分钟
class PubSub {
  constructor(){
    // 事件缓存列表
    this.list = {}
  }
  // 订阅
  on(name,fn){
    if(this.list[name]){
      this.list[name].push(fn)
    }else{
      this.list[name] = [fn]
    }
  }
  // 取消订阅
  off(name,fn){
    // 先找到订阅的事件
    let task = this.list[name];
    // 判断该事件是否存在
    if(task){
      let index = task.findIndex(f === fn || f === fn.callback)
      this.list[name].splice(index,1)
    }
  }
  // 发布
  emit(name,once, ...args){
    if(this.list[name]){
      for( let fn of this.list[name]){
        fn(...args)
      }
    }

    // 如果只发布订阅一次,那么执行完上面代码就删除它
    if(once){
      delete this.list[name]
    }
  }
}

// 测试
let eventBus = new PubSub()
let fn1 = function(name, age) {
	console.log(`${name} ${age}`)
}
let fn2 = function(name, age) {
	console.log(`hello, ${name} ${age}`)
}
eventBus.on('a', fn1)
eventBus.on('a', fn2)
eventBus.emit('a', false, '隔壁老王', 12)