const cb = ()=>{
console.log('触发了')
}
document.addEventListener('aa', cb,{
once: true
})
document.removeEventListener('aa', cb)
const e = new Event('aa')
document.dispatchEvent(e)
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) {
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) => {
console.log(b)
}
bus.on('message', fn)
bus.emit('message',123)