返回介绍

发布订阅

发布于 2024-09-07 20:34:44 字数 1370 浏览 0 评论 0 收藏 0

用过 Vue 的 eventBus 的同学应该很熟悉, $on 订阅事件, $emit 发布事件

class EventEmitter {
  constructor() {
    this.events = {}
  }

  // 订阅事件
  on(event, callback) {
    if(!this.events[event]) {
      this.events[event] = []
    }
    // 将事件对应的回调放入该事件的事件队列中
    this.events[event].push(callback)
    return this
  }

  //发布事件
  emit(event, args) {
    const callbackList = this.events[event]
    if(callbackList.length) {
      callbackList.forEach(cb => cb.apply(this, args))
    }
    return this
  }

  // 删除订阅
  off(event, callback) {
    // event 没传,则删除所有订阅的事件
  if (typeof event === 'undefined') {
    delete this.events
    } else if (typeof event === 'string') {
    // 删除指定事件的回调 
    if (typeof callback === 'function') {
      this.events[ event ] = this.events[ event ].filter((cb) => cb !== callback)
    } else {
      // 删除整个事件
      delete this.events[ event ]
    }
    }

    return this
  }
  // 只进行一次的事件订阅
  once (event, callback, context) {
    const proxyCallback = (...args) => {
    callback.apply(context, args)
    // 回调函数执行完成之后就删除事件订阅
    this.off(event, proxyCallback)
    }

    this.on(event, proxyCallback, context)
  }
}

// 写完测一把
const bus = new EventEmitter()

// 先订阅一个事件
bus.on('add', () => {
  console.log('nanjiu')
})
// 发布事件
bus.emit('add') // nanjiu

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文