手写发布订阅模式

1,713 阅读1分钟
class EventPubSub{
    constructor(){
        this.event = {};
    }
    //订阅
    on(type, callback){
        if(!this.event[type]){
           this.event[type] = [callback];
        }else{
            this.event[type].push(callback);
        }
    }
    //解除订阅
    off(type, callback){
        if(!this.event[type]){
            return;
        }
        this.event[type] = this.event[type].filter(item => {
            return item != callback;
        })
    }
    //发布
    emit(type, ..args){
        if(!this.event[type]){
            return;
        }
        this.event[type].forEach(callback => {
            callback.apply(this, args);
        })
    }
    //执行一次
    once(type, callback){
        function f(){
            callback();
            this.off(type, f);
        }
        this.on(type, f);
    }
}
// 使用如下 
// const event = new EventEmitter(); 
// const handle = (...rest) => { 
// console.log(rest);
// };
// event.on("click", handle); 
// event.emit("click", 1, 2, 3, 4); 
// event.off("click", handle); 
// event.emit("click", 1, 2); 
// event.once("dbClick", () => { 
// console.log(123456); 
// }); 
// event.emit("dbClick"); 
// event.emit("dbClick");