编写发布订阅模式
这是更具订阅模式写的代码 可以理解订阅模式的思想
interface I {events:Map<string,Function[]>once:(event:string,callback:Function)=>void // 触发一次on:(event:string,callback:Function)=>void // 订阅emit:(event:string,...args:any[])=>void // 派发off:(event:string,callback:Function)=>void // 删除监听器
}
class Emitter implements I {events: Map<string, Function[]>;constructor(){this.events = new Map()}once(event:string,callback:Function){// 创建一个自定义函数 通过on 触发 触发完之后立马通过off 回收掉const cb = (...args:any[]) => {callback(...args)this.off(event,cb)}this.on(event,cb)}off(event:string,callback:Function){const callbackList = this.events.get(event)if(callbackList){callbackList.splice(callbackList.indexOf(callback),1)} }emit(event:string,...args:any[]){const callbackList = this.events.get(event)if(callbackList){callbackList.forEach(fn=>{fn(...args)})}}on(event:string,callback:Function){// 证明存过了if(this.events.has(event)){const callbackList = this.events.get(event)callbackList && callbackList.push(callback)}else{// 否则就是第一次存this.events.set(event,[callback])}}
}const bus = new Emitter()
const fn = (b:boolean,n:number) => {console.log(1,b,n)
}bus.on('message',fn)
bus.on('message',fn)bus.emit('message',false,1)