发布订阅模式

184 阅读1分钟
const eventHub = {
    queueMap:{},
    // 监听
    on:(name,f)=>{
        // 需要将f放入到一个name的队列,故需要一个map队列
        eventHub.queueMap[name] = eventHub.queueMap[name] || []
        eventHub.queueMap[name].push(f)
    },
    // 关闭
    off:(name,f)=>{
        const q = eventHub.queueMap[name]
        // 处理特殊情况
        if(!q){
            return
        }
        const index = q.indexOf(f)
        // 处理特殊情况
        if(index < 0){
            return 
        }
        q.splice(index,1)
    },
    // 触发
    emit:(name,data)=>{
        const q = eventHub.queueMap[name]
        // 处理特殊情况
        if(!q){
            return
        }
        q.map(f =>f.call(undefined, data))
    },
    // 一次订阅
    once:(name,f)=>{
        const wrapper = (data) =>{
            // 当触发wrapper时先执行关闭
            eventHub.off(name,wrapper)
            f.call(undefined,data)
        }
        eventHub.on(name,wrapper)
    },
}

// 验证
eventHub.on("click",console.log)
eventHub.once("click",console.error)
setTimeout(()=>{
    eventHub.emit("click","hello")
},3000)