用 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.xdnf.cn/news/1540251.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

通过蓝图Blueprint完成项目拆分、模块化以及模块化后项目结构分析

1、不拆分项目之前的写法 在上一篇Flask入门和视图中我们讲解了Flask项目的一个启动流程,引入Flask、创建Flask对象,然后由路由进入在视图函数中通过模版渲染或者json系列化的方式返回页面或者数据。我们发现这些所有的操作都是在一个页面中完成的&…

不只是模仿,伯克利新研究赋予机器人跨实体自主学习的能力,零样本时代已来

导读: 在当今科技飞速发展的时代,机器人技术正不断地给我们带来惊喜和变革。2024 年 9 月,一篇来自加州大学伯克利分校、丰田研究所和Physical Intelligence 的研究论文RoVi-Aug: Robot and Viewpoint Augmentation for Cross-Embodiment Rob…

C++ | 二叉搜索树

前言 本篇博客讲解c中的继承 💓 个人主页:普通young man-CSDN博客 ⏩ 文章专栏:C_普通young man的博客-CSDN博客 ⏩ 本人giee: 普通小青年 (pu-tong-young-man) - Gitee.com 若有问题 评论区见📝 🎉欢迎大家点赞&…

超详细!百分百安装成功pytorch,建议收藏

文章目录 一、Anaconda安装1.1下载anaconda1.2配置Anaconda环境1.3验证anaconda是否安装成功 二、查看电脑显卡三、更新显卡驱动3.1下载驱动3.2、查看显卡驱动版本 四、cuda安装4.1CUDA下载4.2CUDA环境配置4.3验证CUDA是否安装成功 五、安装pytorch4.1下载pytorch5.2验证pytorc…

OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【内核通信机制】上

往期知识点记录: 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~ 子系统开发内核 轻量系统内核(LiteOS-M) 轻量系统内核&#…

力扣 18.四数之和

文章目录 题目介绍解法 题目介绍 解法 思路和 15. 三数之和 一样,排序后,枚举 nums[a] 作为第一个数,枚举 nums[b] 作为第二个数,那么问题变成找到另外两个数,使得这四个数的和等于 target,这可以用双指针…

《线性代数》常用公式定理总结

文章目录 1 行列式1.1 克拉默法则1.2 基本性质1.3 余子式 M i j M_{ij} Mij​1.4 代数余子式 A i j ( − 1 ) i j ⋅ M i j A_{ij} (-1)^{ij} \cdot M_{ij} Aij​(−1)ij⋅Mij​1.5 具体型行列式计算(化为基本型)1.5.1 主对角线行列式:主…

git 本地分支误删,怎么恢复?误删本地已提交未推送的分支!

误删本地已提交未推送的分支! 前提: 已提交! 重点:未推送! 要是推送了,再拉一下代码就行了。你也不会来搜这个帖子了。 如果你删除的分支里有你未提交的代码,不用往下看了,帮不到你…

树莓派4B+UBUNTU20.04+静态ip+ssh配置

树莓派4B+UBUNTU20.04+静态ip+ssh配置 1.烧录Ubuntu镜像1.1选择pi 4b1.2选择ubuntu server (服务器版,无桌面)20.041.3选择sd卡1.4 点击右下角 NEXT ,编辑设置,输入密码,wifi选CN, 开启ssh1.5 烧录,依次点击“是”,等待完成2 烧录完成后装入树莓派,上电,等待系统完成配…

电竞显示器哪个牌子好

电竞显示器哪个好?你想成为电竞选手吗?显示器很关键,下面我就列举7款市面流行的电竞显示器给大家看看,总有一款适合你。 1.电竞显示器哪个好 - 蚂蚁电竞 ANT255VF电竞显示器 一、产品概述 蚂蚁电竞 ANT255VF电竞显示器是一款专为…

鱼哥好书分享活动第31期:如何构建出更好的大模型RAG系统?《大模型RAG实战》

鱼哥好书分享活动第31期:如何构建出更好的大模型RAG系统?《大模型RAG实战》 S1 初级RAGS2 高级RAG模型测策略测模型微调测 S3 超级RAG购买链接:内容简介:赠书抽奖规则: ChatGPT爆火之后,以ChatPDF为首的产品组合掀起了…

Node-red 某一时间范围内满足条件的数据只返回一次

厂子里有个业务需求增加一段逻辑,根据点位数值,判断是否让mes执行之后的逻辑。 网关采集周期5s/次,及数据上报周期5s/次; iot通过网关写入时间为8s左右; 同类设备共用一条规则链; 想当触发条件时修改”完成上传“不…

简单题67.二进制求和 (java)20240919

题目描述: Java: class Solution {public String addBinary(String a, String b) {StringBuilder result new StringBuilder();int i a.length()-1;int j b.length()-1;int carry 0; //记录进位信息while(i>0 || j>0 || carry!0){int sum ca…

[Linux#55][网络协议] 序列化与反序列化 | TcpCalculate为例

目录 1. 理解协议 1.1 结构化数据的传输 序列化与反序列化 代码感知: Request 类 1. 构造函数 2. 序列化函数:Serialize() 3. 反序列化函数:DeSerialize() 补充 4. 成员变量 Response 类 1. 构造函数 2. 序列化函数:…

免费下载PDF | 自然语言处理新范式:基于预训练模型的方法

前言 本次给大家推荐阅读的书籍是——《自然语言处理:基于预训练模型的方法》。近些年来,以GPT、BERT为代表的预训练模型在自然语言处理领域掀起了一股浪潮,打开了“预训练精调”的自然语言处理新范式的大门。 由电子工业出版社出版的《自然…

动手学深度学习(pytorch土堆)-06损失函数与反向传播、模型训练、GPU训练

模型保存与读取 完整模型训练套路 import torch import torchvision.datasets from torch import nn from torch.nn import Conv2d, MaxPool2d, Flatten, Linear from torch.utils.data import DataLoader from torch.utils.tensorboard import SummaryWriterfrom model impo…

AV1 Bitstream Decoding Process Specification--[7]: 语法结构语义-3

原文地址:https://aomediacodec.github.io/av1-spec/av1-spec.pdf 没有梯子的下载地址:AV1 Bitstream & Decoding Process Specification摘要:这份文档定义了开放媒体联盟(Alliance for Open Media)AV1视频编解码…

分发饼干00

题目链接 分发饼干 题目描述 注意点 1 < g[i], s[j] < 2^31 - 1目标是满足尽可能多的孩子&#xff0c;并输出这个最大数值 解答思路 可以先将饼干和孩子的胃口都按升序进行排序&#xff0c;随后根据双指针 贪心&#xff0c;将当前满足孩子胃口的最小饼干分配给该孩…

再次理解UDP协议

一、再谈端口号 在 TCP / IP 协议中&#xff0c;用 "源 IP", "源端口号", "目的 IP", "目的端口号", "协议号" 这样一个五元组来标识一个通信(可以通过 netstat -n 查看) 我们需要端口号到进程的唯一性&#xff0c;所以一个…

Obsidian如何粘贴的图片类似于Typora,图片相对当前路径

添加插件 下载插件&#xff1a; Custom Attachment Location 基础设置 同时需要在下面进行设置 示意效果