手写发布订阅EventEmitter

373 阅读1分钟

定义EventEmitter

 class EventEmitter {
    constructor() {
       this.subs = {} 
    }
    on(event,cb) {
        (this.subs[event] || (this.subs[event] = [])).push(cb)
    }
    emit(event,...args) {
        this.subs[event] && this.subs[event].forEach(cb => {
            cb(...args)
        });
    }
    once(event,onceCb) {
        this.on(event,(...args) => {
            onceCb(...args)
            this.off(event,onceCb)
        })  
    }
    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 event = new EventEmitter()
    // 监听事件
    event.on('message', function (text) {
      console.log(text)
    })
    // 触发事件
    event.emit('message', 'hello world')