手写发布订阅

23 阅读1分钟

const eventHub = {
    map:{},
    on:(name,fn)=>{
        eventHub.map[name]=eventHub.map[name] || []
        eventHub.map[name].push(fn)
    },
    emit:(name,data)=>{
        const q = eventHub.map[name]
        if(!q) {return} 
        q.map(f=>f.call(undefined,data))
        return undefined
    },
    off:(name,fn)=>{
        const q = eventHub.map[name]
        if(!q) {return}
        const index = q.indexOf(fn)
        if(index<0) {return}
        q.splice(index,1)
    }
}

eventHub.on('click',console.log)
eventHub.on('click',console.error)

setTimeout(()=>{
    eventHub.emit('click','frank')
},3000)

image.png