Skip to content

发布订阅


定义:发布订阅模式定义了对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于他的对象都将得到通知。

  • PubSub:包含所有功能的订阅/发布消息的管理者
  • PubSub.subscribe(msg, subscriber):订阅消息,指定消息名和订阅者回调函数
  • PubSub.publish(msg, data):发布消息,指定消息名和数据
  • PubSub.unsubscribe(flag):取消订阅,根据标识取消某个或某些消息的订阅
javascript
const PubSub = {
  id: 1,
  callbacks: {
   // pay: {
   //   token_1: fn1
   //   token_2: fn2
   // }
  }
}

// 订阅
PubSub.subscribe = function (channel, callback) {
  // 唯一编号
  let token = 'token_' + this.id++;
  // 判断callbacks是否存在channel
  if (this.callbacks[channel]) {
    this.callbacks[channel][token] = callback;
  } else {
    this.callbacks[channel] = {
      [token]: callback
    }
  }
  return token;
}

// 发布
PubSub.publish = function (channel, callback) {
  // 获取当前频道的所有回调,遍历执行
  if (this.callbacks[channel]) {
    Object.values(this.callbacks[channel]).forEach(callback => {
      callback(data)
    })
  }
}

// 取消订阅(根据token)
PubSub.unsubscribe = function (flag) {
  if (!flag) {
    this.callbacks = {}
  } else if (typeof flag === 'string') {
    if (flag.includes('token')) {
      const callbackobj = Object.values(this.callbacks).find(obj => obj.hasOwnProperty(flag))
    }
    if (callbackobj) {
      delete callbackobj[flag]
    }
  } else {
    delete this.callbacks[flag]
  }
}