Pubsub(订阅与发布)、EventBus(事件总线)

介绍

用于组件之间通信,可以实现任意组件的通信
发布订阅模式

使用

下载

npm i pubsub-js -s

引入,用到的文件都要引入

import pubsub from 'pubsub-js'

发布

pubsub.publish("hello", 666)

订阅

this.d_pid = pubsub.subscribe("hello", (msgName, data) => {
      console.log("有人发布了hello消息," + msgName + "回调执行了,收到数据:" + data);
      //有人发布了hello消息,hello回调执行了,收到数据:666
})

订阅参数解释

PubSub.subscribe(name,(meg,data)=>{})
第一个参数是订阅的事件
第二个参数是别人发布了订阅以后执行的函数,接收的meg是事件名字name的值,data是别人发布订阅传递过来的数据

发布参数解释

pubsub.publish(name,data)
第一个参数是发布事件(与订阅事件同名,才能对接)
第二个是传递参数

this.d_pid : 作为标识(销毁的时候好销毁)
组件销毁时,一定要及时清除订阅事件

事件总线

事件总线,说白了就是一个对象,它有一个events对象,里面存了一些键值对,键值为callback(回调函数,记住回调函数的作用域取决于所定义的时候),还有emit事件,就是拿到events对象中属性对应的键值,就是对应的回调函数,然后把参数加进去,执行即可。其它的取消对应的事件和取消全部事件就更简单了。
我们在用的时候,例如Vue,我们直接生成一个实例,挂载到Vue全局对象上即可,当然这里说的是Vue2版本,总之要保证我们订阅发布操作要再同一个实例上。如果不在同一个实例对象上就没有什么意义。

我们来用代码实现一下事件总线

type Callback<T> = (payload: T) => void;

class EventBus<T> {
    private events: { [event: string]: Array<Callback<T>> } = {};
	// 注册事件
    on(event: string, callback: Callback<T>): void {
        if (!this.events[event]) {
            this.events[event] = [];
        }
        this.events[event].push(callback);
    }
	// 发射事件
    emit(event: string, payload: T): void {
        if (this.events[event]) {
            this.events[event].forEach(callback => {
                callback(payload);
            });
        }
    }
	// 取消事件
    off(event: string, callback: Callback<T>): void {
        if (this.events[event]) {
            this.events[event] = this.events[event].filter(cb => cb !== callback);
        }
    }
	// 清空事件
    clear(): void {
        this.events = {}
    }
}

我们首先定义了一个泛型类 EventBus,它接受一个类型参数 T,表示事件携带的数据类型。接着,我们定义了一个类型别名 Callback,它表示一个回调函数,它接受一个类型为 T 的参数,并返回 void。然后,我们在 EventBus 类中使用了一个对象来存储事件名称和对应的回调函数,以及 on、emit 和 off 三个方法来注册、触发和移除事件。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Redis 的订阅发布机制是一种消息传递模式,它允许不同的进程或客户端之间通过 Redis 服务器进行通信。在这种模式下,客户端可以订阅一个或多个频道(channel),并接收订阅的频道中发布的消息。发布者可以向一个或多个频道发布消息,所有订阅该频道的客户端都会收到该消息。 使用 Redis 的订阅发布机制可以实现一些很有用的功能,例如实时消息推送、消息队列等。 在 Redis 中,可以使用以下命令来实现订阅发布操作: 1. SUBSCRIBE channel [channel ...]:订阅一个或多个频道。 2. UNSUBSCRIBE [channel [channel ...]]:取消订阅一个或多个频道。 3. PUBLISH channel message:向指定的频道发布一条消息。 例如,如果要订阅名为 "news" 的频道,可以使用以下命令: ``` SUBSCRIBE news ``` 如果要向 "news" 频道发布一条消息,可以使用以下命令: ``` PUBLISH news "Hello, world!" ``` 所有订阅 "news" 频道的客户端都会收到该消息。 除了以上命令之外,Redis 还提供了一些其他的命令和功能,例如: 1. PSUBSCRIBE pattern [pattern ...]:使用通配符订阅一组频道。 2. PUNSUBSCRIBE [pattern [pattern ...]]:取消订阅一组使用通配符订阅的频道。 3. PUBSUB subcommand [argument [argument ...]]:获取有关订阅发布操作的统计信息。 需要注意的是,在使用 Redis 的订阅发布机制时,订阅者需要持续连接到 Redis 服务器,以便能够接收实时的消息。因此,如果订阅者断开连接或者出现网络故障,需要重新建立连接并重新订阅频道。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

李和贵

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

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

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

打赏作者

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

抵扣说明:

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

余额充值