发布订阅模式代码实现

发布订阅模式简介:订阅者(Subsciber)通过事件注册(Subscribe)将订阅事件提交到调度中心(Topic),调度中心保存好订阅者的注册信息(回调函数),每当发布者(Publisher)发布事件的时候,通过事件发布(Publish)将发布的消息提交到调度中心,然后调度中心统一处理订阅者注册该事件的消息(执行注册时的回调函数)。

show me the code:

     //创建一个发布订阅模式
     function Pubsub(){
        //订阅中心,保存不同的订阅事件名称name
        this.topics={}
        //首先需要创建发布订阅事件主题,订阅者通过这个名称注册,发布者通过这个名称发布消息
        this.topic=function(name){ 
            !this.topics[name] && (this.topics[name] = [])
            console.log("创建")
            console.log(this.topics)
        }
        //订阅注册 订阅者调用此方法,传入订阅事件名
        this.subscribe=function(name,callback){  
            if(!this.topics[name]){
                console.log("无效的主题")
                return
            }
            if(typeof callback !== "function"){
                console.log("无效回调")
                return
            }
            this.topics[name].push(callback)
            console.log("sub")
            console.log(this.topics)
        }
        //取消订阅 订阅者调用此方法,传入订阅事件名
        this.unsubscribe=function(name,callback){ 
            this.topics[name].forEach((item,idx)=>{ 
                if(item == callback){
                    this.topics[name][idx]=null  //注销订阅者的注册事件
                }
            })
            console.log(this.topics)
        }
        //发布 执行订阅主题下各个订阅者者的注册内容
        this.publish=function(name,params){
            if(this.topics[name] && this.topics[name].length > 0){
                this.topics[name].forEach((item,idx)=>{
                    item(params)
                })
            }
            console.log(this.topics)
        }
    }
    //实例化一个发布订阅模式,多个new,可以做到事件隔离,正常一个项目一个就够了
    const pub1 = new Pubsub()
    //调用 示例 
    pub1.topic("on-sleep)  //创建一个睡觉的订阅主题
    //同学1 订阅睡觉
    pub1.subscribe("on-sleep",(a)=>{
        console.log("sleep")
        console.log(a)
    })
    //同学2 订阅睡觉  回调不同
    pub1.subscribe("on-sleep",(a)=>{
        console.log("sleep2”)
        console.log(a)
    })

    setTimeout(()=>{
        //时间差不多了,通知他们该睡觉了!
        pub1.publish("on-sleep",{info:"该睡觉啦!"})
    },2000)

更多思考: 手动实现发布订阅模式结合Object.defineProperty数据劫持,实现vue的双向绑定

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值