TS编写发布订阅模式
interface PubSubType {
events: { [key: string]: { name: string, once: boolean, cb: Function }[] }
on(name: string, cb: Function): void
once(name: string, cb: Function): void
emit(name: string, ...arg: Array<any>): void
off(name: string, cb: Function): void
}
class PubSub implements PubSubType {
events: { [key: string]: { name: string, once: boolean, cb: Function }[] }
constructor() {
this.events = {}
}
private eventsOnApi(this: PubSubType, name: string, cb: Function, once: boolean = false) {
const list = this.events[name] || [];
list.push({ name, cb, once })
this.events[name] = list
}
on(name: string, cb: Function): void {
this.eventsOnApi(name, cb)
}
once(name: string, cb: Function): void {
this.eventsOnApi(name, cb, true)
}
emit(name: string, ...arg: Array<any>): void {
const list = this.events[name];
list && list.forEach(item => {
if (item.once) {
item.cb.apply(this, arg)
this.off(name, item.cb)
} else {
item.cb.apply(this, arg)
}
})
}
off(name: string, cb: Function): void {
const list = this.events[name];
if (!list) return
const fileList = list.filter(item => item.cb !== cb)
this.events[name] = fileList
}
}