前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一个简单的EventEmitter

一个简单的EventEmitter

作者头像
zhaokang555
发布2023-10-17 09:57:16
750
发布2023-10-17 09:57:16
举报
文章被收录于专栏:赵康的日常专栏

用JS写了一个简单的EventEmitter:

代码语言:javascript
复制
class EventEmitter {
  /**
   * 事件名/回调列表 字典
   * @type {Map<string, Array<function>>}
   * @private
   */
  _callbackListMap = new Map()

  /**
   * 监听事件
   * @param eventName: string
   * @param cb: function
   */
  on(eventName, cb) {
    let cbList = this._callbackListMap.get(eventName)
    if (cbList == null) {
      this._callbackListMap.set(eventName, [])
      cbList = this._callbackListMap.get(eventName)
    }
    if (Array.isArray(cbList)) {
      cbList.push(cb)
    }
  }

  /**
   * 取消监听事件
   * @param eventName: string
   * @param cb: function | null
   */
  off(eventName, cb = null) {
    // 取消监听事件上的所有回调
    if (cb == null) {
      this._callbackListMap.delete(eventName)
    // 取消监听事件上的单个回调
    } else {
      let cbList = this._callbackListMap.get(eventName)
      if (Array.isArray(cbList)) {
        let i = cbList.findIndex(fn => fn === cb)
        if (i > -1) {
          cbList.splice(i, 1)
        }
      }
    }
  }

  /**
   * 触发某个事件
   * @param eventName: string
   * @param rest: Array<any>
   * @protected
   */
  emit(eventName, ...rest) {
    let callbackList = this._callbackListMap.get(eventName)
    if (Array.isArray(callbackList)) {
      callbackList.forEach(fn => fn(...rest))
    }
  }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-01-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档