事件总线(发布订阅模式)

179 阅读1分钟

事件总线

事件总线这个概念对你来说可能很陌生,但提到观察者(发布-订阅)模式,你也许就很熟悉。事件总线是对发布-订阅模式的一种实现。它是一种集中式事件处理机制,允许不同的组件之间进行彼此通信而又不需要相互依赖,达到一种解耦的目的。

class EventBus{
    constructor(){
        //创建缓存对象
        this.cache={}
    }
    on(name,fn){
        //判断是否有该事件,新增或者推送
        if(this.cache[name]){
            this.cache[name].push(fn)
        }else{
            this.cache[name]=[fn]
        }
    }
    off(name,fn){
        let tasks=this.cache[name]
        if(tasks){
            const index=tasks.findIndex(f=>f===fn||f.callback===fn)
            if(index>=0){
                tasks.splice(index,1)
            }
        }
    }
    emit(name,once=false,...args){
        if(this.cache[name]){
            //浅拷贝一个副本
            let tasks=this.cache[name].slice()
            for(let fn of tasks){
                fn(...args)
            }
            if(once){
                delete this.cache[name]
            }
        }
    }
}

const eventbus=new EventBus()
const fn1=function(name,age){
    console.log(`${name},${age}`)
}
const fn2=function(name,age){
    console.log(`hello${name},${age}`)
}

eventbus.on('demo',fn1)
eventbus.on('demo',fn2)
eventbus.emit('demo',false,'张三',18)