美文网首页
发布订阅

发布订阅

作者: 与你清欢_李 | 来源:发表于2019-07-11 19:34 被阅读0次

    期望的数据类型
    {
    event: [fn1, fn2],
    }

    class EventEmitter {
      constructor() {
        this.subs = {}
      }
    
      /**
       *
       * 注册事件
       * @param {*} event
       * @param {*} cb
       * @memberof EventEmitter
       */
      on(event, cb) {
        // 注册订阅 事件 和增加回调方法
        ;(this.subs[event] || (this.subs[event] = [])).push(cb)
      }
    
      /**
       *
       * 发布事件
       * @param {*} event
       * @param {*} args
       * @memberof EventEmitter
       */
      trigger(event, ...args) {
        // 执行 事件中回调方法内的所有 函数
        this.subs[event] && this.subs[event].forEach(cb => cb(...args))
      }
    
      /**
       *
       * 执行一次
       * @param {*} event
       * @param {*} onceCb
       * @memberof EventEmitter
       */
      once(event, onceCb) {
        const cb = (...args) => {
          onceCb(...args)
          // 执行完移除
          this.off(event, onceCb)
        }
        this.on(event, cb)
      }
    
      /**
       *
       * 移除注册事件
       * @param {*} event
       * @param {*} offCb
       * @memberof EventEmitter
       */
      off(event, offCb) {
        if (this.subs[event]) {
          let index = this.subs[event].findIndex(cb => cb === offCb)
          this.subs[event].splice(index, 1)
          if (!this.subs[event].length) delete this.subs[event]
        }
      }
    }
    
    let en1 = new EventEmitter()
    
    en1.on('t', () => {
      console.log('t')
    })
    
    en1.trigger('t')
    

    相关文章

      网友评论

          本文标题:发布订阅

          本文链接:https://www.haomeiwen.com/subject/jwkjkctx.html