当前位置: 首页 > article >正文

用 JS 实现一个发布订阅模式

在JavaScript中,发布订阅模式(Pub/Sub)是一种常用的设计模式,用于实现不同组件之间的解耦通信。在这种模式中,发布者(Publisher)不直接给订阅者(Subscriber)发送消息,而是将消息发送到一个中心主题(Topic),订阅了该主题的订阅者会收到这个消息。

下面是一个简单的发布订阅模式的实现示例:

class PubSub {  
    constructor() {  
        this.topics = {}; // 存储所有主题的订阅者  
    }  
  
    // 订阅主题  
    subscribe(topic, callback) {  
        if (!this.topics[topic]) {  
            this.topics[topic] = []; // 如果该主题不存在,则初始化一个空数组  
        }  
        this.topics[topic].push(callback); // 将回调函数添加到订阅者列表中  
        return () => { // 返回一个取消订阅的函数  
            this.unsubscribe(topic, callback);  
        };  
    }  
  
    // 取消订阅  
    unsubscribe(topic, callback) {  
        if (this.topics[topic]) {  
            const index = this.topics[topic].indexOf(callback);  
            if (index > -1) {  
                this.topics[topic].splice(index, 1); // 从订阅者列表中移除回调函数  
            }  
        }  
    }  
  
    // 发布消息  
    publish(topic, data) {  
        if (this.topics[topic]) {  
            this.topics[topic].forEach(callback => {  
                callback(data); // 遍历订阅者列表,调用每个订阅者的回调函数  
            });  
        }  
    }  
}  
  
// 使用示例  
const pubSub = new PubSub();  
  
// 订阅者1  
const subscriber1 = (data) => {  
    console.log('Subscriber 1:', data);  
};  
  
// 订阅者2  
const subscriber2 = (data) => {  
    console.log('Subscriber 2:', data);  
};  
  
// 订阅主题  
const unsubscribe1 = pubSub.subscribe('news', subscriber1);  
pubSub.subscribe('news', subscriber2);  
  
// 发布消息  
pubSub.publish('news', 'Hello, Pub/Sub!');  
  
// 取消订阅  
unsubscribe1();  
pubSub.publish('news', 'This message will not be seen by subscriber 1.');

在这个示例中,PubSub 类有三个主要方法:

  • subscribe(topic, callback):订阅一个主题,并传入一个回调函数。该方法返回一个函数,用于取消订阅。
  • unsubscribe(topic, callback):取消订阅一个主题上的回调函数。
  • publish(topic, data):向一个主题发布消息,所有订阅了该主题的回调函数都会被调用,并接收到发布的消息数据。

通过这种方式,发布者和订阅者之间实现了松耦合,它们不需要知道对方的存在,只需要通过主题进行通信。


http://www.kler.cn/news/313497.html

相关文章:

  • Stable Diffusion绘画 | ControlNet应用-qrcode 二维码控制器:艺术二维码来啦
  • 基于微服务架构的非结构化数据中台设计
  • 网址匹配正则表达式(python实现)
  • SaaS 架构:益处及挑战
  • 安谋科技发布全新自研“玲珑”多媒体处理器
  • macOS 中搭建 Flutter 开发环境
  • 微软发布Windows Agent Arena 为生成式AI代理提供基准测试
  • 动手学习RAG: 大模型向量模型微调 intfloat/e5-mistral-7b-instruct
  • [网络层]-IP协议相关特性
  • 记忆化搜索专题——算法简介力扣实战应用
  • JavaScript 与 Java 的继承有何区别?-----原型继承,单继承有何联系?
  • 微信小程序/uniapp 程序分包处理,小程序性能优化
  • 错题集锦之C语言
  • NumPy库学习之argmax函数
  • C++【类和对象】(一)
  • 数据结构--图
  • k8s的基础
  • YOLOv8改进,YOLOv8替换主干网络为VanillaNet( CVPR 2023 华为提出的全新轻量化架构),大幅度涨点
  • Remix在SPA模式下,出现ErrorBoundary错误页加载Ant Design组件报错,不能加载样式的问题
  • 使用注意力机制可以让你的模型更加灵活,但是需要额外的计算资源。rnn lstm bilstm attension
  • 【论文阅读】PERCEIVER-ACTOR: A Multi-Task Transformer for Robotic Manipulation
  • 开关磁阻电机(SRM)系统的matlab性能仿真与分析
  • python知识点100篇系列(17)-替换requests的python库httpx
  • Python学习
  • yolo自动化项目实例解析(四)ui页面整理1 (1.85)
  • git merge如何忽略部分路径
  • sqli-lab靶场学习(四)——Less11-14(post方法)
  • 微信小程序中的实时通讯:TCP/UDP 协议实现详解
  • Closure 是个数据结构
  • 如何在 Ubuntu 上安装 OpenSSH Server ?