发布-订阅模型编码实现

47 阅读1分钟
class myEventEmitter{
    constoesr(){
        //eventMap 用来存贮事件和监听函数之间的关系
        this.eventMap = {};
    }
    on(type,handler){
        //handle必须是一个函数,如果不是直接报错
        if(!(handler instanceof Function)){
            throw new Error("错了,传函数")
        }
        //判断type事件对应的队列是否存在
        if(!this.eventMap[type]){  
            //若不存在,新建该队列                                                 
            this.eventMap[type] = []
       }
       //若存在,直接往队列里推入handler
       this.eventMap[type].push(handler)
    }
    //可以携带数据,params就是数据的载体
    emit(type,params){
        //假设该事件是有订阅的 (对应的事件队列存在)
        if(this.eventMap[type]){
            //将事件队列里的handler依次执行出列
            this.eventMap[type].forEach((handler,index)=>{
                //注意别忘了读取params
                handler(params)
            })
        }
    }
    off(type,handler){
        if(this.eventMap[type]){
            this.eventMap[type].splice(this.eventMap[type].indexOf(handler)>>>0,1)
        }
    }
}
使用
const myEvent = new myEventEmitter();
const testHandler = function (params) {
    console.log('触发',params)
}
//监听test事件
myEvent.on('test',testHandler);
//在触发test事件的同时,传入希望testHandler感知的参数
myEvent.emit('test','newState');