新闻中心

J*aScript实现发布订阅模式_j*ascript设计模式

2025-11-01
浏览次数:
返回列表
发布订阅模式通过事件中心实现组件间解耦,支持on、emit、off和once方法,适用于跨组件通信与异步通知,需注意及时取消订阅以避免内存泄漏。

javascript实现发布订阅模式_javascript设计模式

发布订阅模式是一种在J*aScript中广泛使用的通信机制,特别适用于解耦组件或模块之间的依赖关系。它允许对象(称为“订阅者”)监听某个事件(由“发布者”触发),而无需彼此直接引用。这种模式在前端开发中常用于状态管理、事件总线、跨组件通信等场景。

基本概念

发布订阅模式包含三个核心角色:

  • 事件中心(Event Bus):负责维护事件列表,提供订阅、取消订阅和触发事件的接口。
  • 发布者(Publisher)强>:当某个事件发生时,向事件中心发送通知。
  • 订阅者(Subscriber):提前注册对某个事件的兴趣,并提供回调函数处理该事件。

简单实现一个事件中心

我们可以用一个简单的J*aScript类来实现发布订阅模式:

class EventEmitter {
  constructor() {
    // 存储事件及其对应的回调函数数组
    this.events = {};
  }

  // 订阅事件
  on(event, callback) {
    if (!this.events[event]) {
      this.events[event] = [];
    }
    this.events[event].push(callback);
  }

  // 发布事件
  emit(event, data) {
    if (this.events[event]) {
      this.events[event].forEach(callback => callback(data));
    }
  }

  // 取消订阅
  off(event, callback) {
    if (this.events[event]) {
      this.events[event] = this.events[event].filter(cb => cb !== callback);
    }
  }

  // 只监听一次
  once(event, callback) {
    const wrapper = (data) => {
      callback(data);
      this.off(event, wrapper);
    };
    this.on(event, wrapper);
  }
}

使用示例

下面是一个实际使用该事件中心的例子:

// 创建事件中心实例
const eventBus = new EventEmitter();

// 订阅用户登录事件
eventBus.on('userLogin', (user) => {
  console.log(`欢迎 ${user.name} 登录系统`);
});

eventBus.on('userLogin', (user) => {
  console.log(`当前用户ID: ${user.id}`);
});

// 某处触发登录事件
eventBus.emit('userLogin', { id: 1, name: 'Alice' });

// 输出:
// 欢迎 Alice 登录系统
// 当前用户ID: 1

也可以使用 once 方法监听只执行一次的事件:

睿拓智能网站系统-网上商城 睿拓智能网站系统-网上商城

睿拓智能网站系统-网上商城1.0免费版软件大小:5M运行环境:asp+access本版本是永州睿拓信息专为电子商务入门级用户开发的网上电子商城系统,拥有产品发布,新闻发布,在线下单等全部功能,并且正式商用用户可在线提供多个模板更换,可实现一般网店交易所有功能,是中小企业和个人开展个人独立电子商务商城最佳的选择,以下为详细功能介绍:1.最新产品-提供最新产品发布管理修改,和最新产品订单查看2.推荐产

睿拓智能网站系统-网上商城 0 查看详情 睿拓智能网站系统-网上商城
eventBus.once('appInitialized', () => {
  console.log('应用初始化完成,仅提示一次');
});

eventBus.emit('appInitialized'); // 触发一次
eventBus.emit('appInitialized'); // 不再响应

应用场景与优势

发布订阅模式适用于以下场景:

  • 跨层级组件通信(如Vue或React中的全局事件总线)
  • 异步任务完成后的通知(如数据加载完毕)
  • 插件系统中各模块间的松耦合交互

它的主要优势在于解耦:发布者不需要知道谁是订阅者,订阅者也不关心谁发布了事件,只要约定好事件名即可协作。这提升了代码的可维护性和扩展性。

基本上就这些。不复杂但容易忽略的是记得清理无用的订阅,避免内存泄漏。特别是在单页应用中,及时调用 off 移除监听是非常必要的。

以上就是J*aScript实现发布订阅模式_j*ascript设计模式的详细内容,更多请关注其它相关文章!


# 的是  # 福山seo推广价格  # 汤泉营销推广方案范文怎么写  # 网站建设公司地址在哪儿  # 邹城推广营销系统招聘  # 营口网站建设模式  # ai网站推广哪家好  # 丰台网站建设咨询  # 小月seo  # 燕郊网站建设渠道  # 宠物在什么网站推广好  # 是一种  # 运行环境  # 是在  # 是一个  # vue  # 复用  # 永州  # 最新产品  # 适用于  # 回调  # 异步任务  # 前端开发  # 回调函数  # app  # 前端  # java  # javascript  # react 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: Python中如何避免重复条件判断:利用数据结构实现动态逻辑  《铁拳8》黑皮辣妹新实机:元气满满的18岁少女!  Python多版本共存与虚拟环境管理深度指南  漫蛙manwa官网登录界面_漫蛙漫画网页版主站入口  Composer的 archive 命令怎么用_快速打包你的PHP项目及其Composer依赖  包子漫画官方网站在线链接-包子漫画在线阅读平台主页地址  Lar*el的路由模型绑定怎么用_Lar*el Route Model Binding简化控制器逻辑  整合Supabase认证与Django模型:跨模式迁移的解决方案  夸克浏览器图书入口 夸克手机浏览器阅读入口  韩小圈电脑版在线入口_网页版免费登录地址  《主播少女的秘密账号迷宫》首支宣传片  Golang如何通过reflect获取匿名字段方法_Golang reflect匿名字段方法访问技巧  如何在更新Composer依赖后自动运行测试_使用post-update-cmd钩子触发PHPUnit  sublime侧边栏怎么增强功能_SideBarEnhancements for sublime安装与配置  Pandas DataFrame 多条件优先级排序与排名  基于动态规划的房屋花卉种植最小成本算法详解  深入理解J*a链表中的IPosition接口与使用  解决macOS上安装pyhdf时‘hdf.h’文件缺失的编译错误  sublime如何配置Go语言开发环境_sublime搭建Golang编译运行系统  台积电1.4nm工艺A14瞄准2028:10年来性能提升80%  知乎APP怎么管理已购盐选内容_知乎APP盐选内容购买记录与查看方法  在Go语言中利用后缀数组处理多字符串:实现高效文本匹配与自动补全  优化MinIO list_objects_v2 操作的性能瓶颈与最佳实践  php源码怎么看淘宝客系统_看php源码淘宝客系统技巧  深入理解Google Cloud Datastore查询:祖先路径与数据一致性  《燕云十六声》两周内达九百万玩家!位居畅销榜第五  Lar*el 8 多关键词数据库搜索优化实践  LINUX的I/O重定向是什么_深入理解LINUX中 >、>> 与 < 的区别  抖音DOU+怎么投最有效 抖音付费推广的ROI提升技巧  2025年云电脑操作系统体验 | 无需本地硬件,随时随地使用高性能PC  俄罗斯方块最新版入口 俄罗斯方块在线玩官网入口  小米汽车11月交付量突破40000台!雷军:将继续努力  在VS Code中配置和运行Dart程序的完整步骤  HTML元素状态管理:根据DIV内容动态启用/禁用按钮  163邮箱官方主页登录 直达网易邮箱登录核心页面  qq游戏手机版下载安装_qq游戏移动端入口  Highcharts 雷达图径向轴标签定制指南:利用多Y轴实现数值标注  必由学登录入口 必由学官方网站在线访问链接  生成rdflib自定义SPARQL函数:参数匹配与实践指南  1688商家版怎样分析买家画像精准供货_1688商家版分析买家画像精准供货【供货策略】  处理Kafka消费者会话超时:深入理解消息处理语义与幂等性  Win10如何恢复误删的快捷方式_Win10重建常用软件快捷方式  12306选座系统怎么选连座_12306选座多人连坐操作方法  印象笔记如何设提醒任务防漏执行_印象笔记设提醒任务防漏执行【任务提醒】  MAC怎么在地图App里使用“四处看看”_MAC体验部分城市的3D实景街景  PrimeNG Sidebar背景色自定义指南:CSS覆盖与主题化实践  J*aScript实现单选按钮与关联输入框的联动禁用教程  Python:递归比较文件夹内容并找出特定类型文件的差异  windows10怎么查看硬盘序列号_windows10硬盘id查询命令  小红书商家版怎样在笔记嵌入商品卡路径_小红书商家版在笔记嵌入商品卡路径【挂载教程】 

搜索