js class 实现发布订阅者模式。

订阅发布模式涉及三个角色:订阅者、事件中心和发布者。在这个模型中,发布者发送消息到事件中心,中心随后通知所有订阅者。以小明购买报纸为例,福利社是事件中心,小明是订阅者,福利社老板是发布者。$on用于订阅,$emit用于触发事件并传递参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

订阅发布模式由三部分构成

1:订阅者

2:事件中心

3:发布者

具体实现流程 发布者发布消息给事件中心 事件中心通知所有的订阅者

demo:

小明天天看手机但是有一天突发奇想,想买个报纸看看,于是小明坐上火箭就飞到福利社了,但是到了福利社老板说今天的报纸卖完了,如果想看就订购明天的报纸吧,小明心有不甘但还是订购了明天的报纸,订购完了,就等福利社老板通知我了(传参数),到了明天老板说报纸有了小明欢快的拿到了报纸(收参数)。

这里指,福利社就是事件中心,而订阅者就是小明,而福利社的老板就是发布者。

实现的大致思路就是calss一个构造函数,

1.定义一个object,

2.$on 实现就是第一个参数传入属性名attr,第二个参数就是callback,判断对象里有没有属性没有属性就添加一个并且赋值为数组,然后往数组里push callBack。

3.而$emit第一个参数传入属性名attr ,第二个就是传给$on 的参数,然后循环执行attr对应的数组里的函数,

$off就是循环对应attr的数组的函数然后过滤非当前函数,就相当于把当前函数给删除了。

class Bus {
    constructor() {
        this.message = {} // 消息队列 福利社
    }
    $on(attr, callBacks) {
        // 消息队列有没有这个属性没有直接赋值空数组
        if (!this.message[attr]) this.message[attr] = []
        // 向 message数组当中进行追加传进来的函数。
        this.message[attr].push(callBacks)
    }
    $emit(attr, ...value) {
        // 没有属性返回空数组  
        let item = this.message[attr] || []
        // 便利执行
        for (let i = 0; i < item.length; i++) {
            let fn = item[i]
            // 把emit的参数传给on绑定的函数
            fn(...value)
        }
    }
    $off(attr, callBacks) {
        if (!this.message[attr]) return
        if (!callBacks) {
            // 没有函数直接赋值为空
            this.message[attr] = []
            return
        }
         // 有函数就把对应的数组里的函数给删除
        this.message[attr] = this.message[attr].filter(item => item != callBacks)
    }

}
let that = new Bus()
let fn = (res, b) => {
    console.log(34, res, b) // 34 {a: 34} 456
}

that.$on('aaa', fn)
that.$emit('aaa', {a:34}, 456) 
that.$off('aaa', fn)

console.log(that, that.message)// {aaa: Array(0)}

学习就这这么简单。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有两把刷子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值