订阅发布模式

什么是发布订阅模式?

发布订阅模式简单的可以理解为:在一个对象中(eventObj)定义了一个变量(store),然后注册了一个事件(on),该注册事件会添加一些回调函数(callback)到变量中(store),然后在其他地方触发(emit)这个注册事件(on)

用自然语言解释:去奶茶店(eventObj)买奶茶,你对服务生小姐姐说我要一杯烧仙草(on),小姐姐把这个事件记录下(在store中添加一条记录:BR小盆友点了一杯烧仙草),然后10分钟后烧仙草做好了,服务生小姐姐对你说:Hi,你的烧仙草(emit)好了。

发布订阅的一个简单实现
  const eventObj = {
    store: {},
    on: (key, callback) => { // 注册
      this.store[key] = !this.store[key] ? [] : this.store[key];
      this.store[key].push(callback);
    },
    emit: (key, data) => { // 订阅
      if(!this.store[key]) return false;
      this.store[key].map(callback => {
        return callback(data);
      })
    }
  }

  // 使用
  eventObj.on('milkTea', ({ customer, milkName }) => { // 买奶茶啦
    console.log(`${customer} 需要一杯 ${milkName}`);
  });
  setTimeout(() => {
    eventObj.emit('milkTea', {customer: 'BR', milkName: '烧仙草'});
  }, 2000);
详解

上面的代码我们简单的实现了一个发布订阅模式,在2S后订阅,这里是一个异步操作,我们可以使用这种模式在下一节实现一个简单的事件总线模型,即组件间相互通信,当然我们也可以继续完善下上面的代码,添加一个取消注册事件,代码如下:

  ...
  unon: (key) => {
    if(this.store[key].length <= 0) return false;
    this.store[key] = null;
  }
  ...