Skip to content

取消订阅

javascript
eventBus.remove = function (key, fn) {
  const fns = this.clientList[key]

  // 如果 key 对应的消息没人订阅,直接返回。
  if (!fns) {
    return
  }

  if (!fn) {

    // 如果没传入具体的 fn,表示取消 key 对应消息的所有订阅
    fns.length = 0
  } else {

    // 取消具体订阅的 fn
    for (let i = fns.length - 1; i >= 0; i--) { // 反向遍历,正向遍历删除后下标不能移动
      const _fn = fns[i]

      if (_fn === fn) {
        fns.splice(i, 1)
      }
    }
  }
}

// A 订阅消息
const fn1 = function (price, squareMeter) {
  console.log(price, squareMeter)
}
salesOffices.listen('squareMeter88', fn1)

// B 订阅消息
salesOffices.listen('squareMeter88', function (price, squareMeter) {
  console.log(price, squareMeter)
})

// 发布消息
salesOffices.trigger('squareMeter88', 2000000, 88)
salesOffices.remove('squareMeter88', fn1)
salesOffices.trigger('squareMeter88', 2000000, 88)