手写EventHub

582 阅读1分钟

EventHub

eventHub是基于发布订阅模式实现的一个实例,常用于多模块(组件)间的通信
EventHub

如何实现

首先确定API
通常有on(注册)/emit(触发)/off(取消)3三个api

eventHub事件总线

它身上有这三个方法

class EventHub{
	on(){},
    emit(){}
    off(){}
}

全部代码

class EventHub {
    cache: { [key: string]: Array<(data: unknown) => void> } = {}
    on(eventName: string, fn: (data: unknown) => void) {
        this.cache[eventName] = this.cache[eventName] || []
        this.cache[eventName].push(fn)
    }
    emit(eventName: string, data?: unknown) {
        (this.cache[eventName] || []).forEach(fn => {
            fn(data)
        })
    }
    off(eventName: string, fn?: (data?: unknown) => void) {
        if (arguments.length > 1) {
            if (this.cache[eventName]) {
                let index = this.cache[eventName].indexOf(fn)
                this.cache[eventName].splice(index, 1)
            }
        }
        this.cache[eventName] = []
    }
}
export default EventHub