ts手撸一个订阅发布模式

77 阅读1分钟

敲敲敲,不敲就会生疏,没事就敲一下吧。

class EventBus {
    events: Record<string, Set<(...args:any[]) => void>> = {}
    on(eventName: string, cb: (...args:any[]) =>void) {
        (this.events[eventName] ??= new Set()).add(cb)
    }
    emit(eventName:string, ...args:any[]) {
        this.events[eventName]?.forEach((cb) => cb(...args))
    }
    off(eventName:string, cb: (...args:any[]) => void){
        this.events[eventName]?.delete(cb)
    }
    once(eventName:string, cb:()=>void) {
        const handler = (...args:ang[]) => {
            cb(...args)
            this.off(eventName, handler)
        }
        this.on(eventName, handler)
    }
}