新闻中心

J*aScript消息队列_事件发布订阅模式实现

2025-11-20
浏览次数:
返回列表
事件发布订阅模式通过事件中心实现对象间松耦合通信,包含发布者、订阅者和事件中心三个角色;J*aScript中可借助EventEmitter类实现subscribe、publish和unsubscribe方法;该模式广泛应用于DOM事件、跨组件通信和状态管理,提升代码解耦与可维护性。

javascript消息队列_事件发布订阅模式实现

J*aScript中的事件发布订阅模式,是一种实现对象间松耦合通信的经典设计模式。它通过引入一个中间角色——事件中心,让消息的发送方(发布者)和接收方(订阅者)无需直接引用对方,就能完成信息传递。这种模式在前端组件通信、状态管理以及异步任务处理中非常实用。

核心概念与角色分工

理解这个模式的关键是弄清三个基本角色:

  • 事件中心(Event Center):也叫消息代理或调度中心,负责维护所有事件的订阅列表,并在事件被触发时通知所有订阅者。
  • 订阅者(Subscriber):对特定事件感兴趣的模块或函数,它向事件中心注册自己的回调函数,声明“我想监听某个事件”。
  • 发布者(Publisher):当某些条件满足或状态改变时,它向事件中心“发布”一个事件,但并不关心谁在监听,也不直接调用任何订阅者的代码。

一个简易的实现示例

下面是一个基于J*aScript类的简单实现,包含了订阅、发布和取消订阅的核心功能:

Docky AI Docky AI

多合一AI浏览器助手,解答问题、绘制图片、阅读文档、强化搜索结果、辅助创作

Docky AI 100 查看详情 Docky AI // 定义一个事件中心类 class EventEmitter { constructor() { // 使用对象存储不同事件名对应的回调函数数组 this.events = {}; } // 订阅事件 subscribe(event, callback) { if (!this.events[event]) { this.events[event] = []; } this.events[event].push(callback); // 返回一个取消订阅的方法,便于后续清理 return () => { this.unsubscribe(event, callback); }; } // 发布事件 publish(event, data) { if (this.events[event]) { this.events[event].forEach(callback => callback(data)); } } // 取消订阅 unsubscribe(event, callback) { if (this.events[event]) { this.events[event] = this.events[event].filter(cb => cb !== callback); } } } // 使用示例 const eventBus = new EventEmitter(); // 订阅 "userLogin" 事件 const unSubscribe = eventBus.subscribe('userLogin', (userInfo) => { console.log('欢迎用户:', userInfo.name); }); // 再订阅一次,可以有多个响应 eventBus.subscribe('userLogin', () => { console.log('更新页面状态'); }); // 发布 "userLogin" 事件 eventBus.publish('userLogin', { name: 'Alice' }); // 控制台输出: // 欢迎用户: Alice // 更新页面状态

实际应用场景

这种模式在日常开发中随处可见:

  • DOM事件系统本身就是典型应用,addEventListener就是订阅,用户操作是发布,removeEventListener用于取消订阅,防止内存泄漏。
  • 在Vue等框架中,通过一个全局的$bus实例实现跨组件通信。
  • 在复杂应用中解耦业务逻辑,比如数据加载完成后自动通知UI组件刷新,而数据模块无需知道UI的存在。
基本上就这些,掌握这个模式能让你的代码结构更清晰,扩展性更强。

以上就是J*aScript消息队列_事件发布订阅模式实现的详细内容,更多请关注其它相关文章!


# 就能  # 营销推广类短信模板图片  # 大连地产网站建设  # 百度推广营销 移动隔墙.cn  # 网站建设pdf 下载  # 昌平区推广营销策划概况  # 动态网站建设个人  # 平谷区网站建设哪个好点  # 抖音关键词排名哪个好  # ins营销推广文案  # seo顾问怎么样  # 并在  # 多个  # vue  # 是一种  # 也不  # 我想  # 是一个  # 复用  # 自己的  # 回调  # 异步任务  # 回调函数  # 前端  # java  # javascript 


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


相关推荐: PowerPoint如何制作滚动字幕结尾彩蛋_PowerPoint路径动画实现平滑滚动字幕效果  单射、满射与双射的关系 一文理清所有逻辑  css元素hover动画延迟生效怎么办_使用animation-delay调整触发时间  css滚动区域卡顿如何改善_css滚动问题用will-change优化渲染  Angular中父组件异步更新子组件复选框状态的实践指南  如何在 Excel Online 和 Google 表格中更改日期格式  优化HTML表单样式:解决输入框焦点跳动与元素间距问题  Surface怎么安装系统 微软Surface Pro U盘重装win11教程  MongoDB聚合管道:正确匹配对象数组中_id的方法  Composer如何解决json扩展缺失的错误  UE5.7引擎表现爆炸优化无敌!5090跑4K稳定60FPS  AI泡沫首次被“刺破”:GPU十年都无法存活!  126邮箱网页版官方入口 126邮箱账号在线登录平台  解决 Express.js 中 PUT 请求密码修改失败的路由配置指南  神庙逃亡小游戏在线玩 神庙逃亡小游戏入口  抖音商城签到领现金是真的吗_抖音商城签到奖励与提现说明  顺丰快递查询系统 官方正版查询入口  在WordPress中通过REST API获取BasicAuth保护的远程文章  一加 Nord 5 隐私权限异常_一加 Nord 5 系统安全优化  C++的std::mdspan是什么_C++23中用于操作多维数组的非拥有视图  J*aScript map 方法中处理循环元素为空数组的策略  抓大鹅无需下载版 抓大鹅秒玩版入口  优化 Python 函数中的条件逻辑:解决 if-else 嵌套与参数选择问题  AO3访问入口汇总 AO3网页版同人作品一键直达  顺丰快件物流信息 官方网站查询入口  Adobe PDF表单中利用J*aScript解析与格式化日期组件的教程  html网页设计源代码怎么运行_运行html网页设计源代码步骤【指南】  Python异步编程实践:使用Binance API构建实时交易数据流  从J*aScript对象中精确提取指定属性的教程  C#使用XPath查询节点时出错? 常见语法错误与调试技巧  win11开机启动修复循环怎么办 Win11无法进入系统高级启动解决方法【修复】  BetterDiscord插件中安全更新用户简介的实践指南  Eclipse怎么运行工程_Eclipse工程运行配置说明  CSS Flexbox与媒体查询:实现响应式布局中元素的并排与堆叠  Go语言HTML解析:利用Goquery精准获取指定元素内容  Excel Power Pivot如何处理XML数据源 构建高级数据模型  如何在J*a中使用Locale处理多语言环境  一加手机拍照效果不好怎么办 一加哈苏影像调校与专业模式使用教程【高手篇】  动漫花园资源网使用步骤_动漫花园资源网下载流程  QQ邮箱官方网页版登录 QQ邮箱个人邮箱快速访问  Win11怎么设置开机NumLock亮 Win11修改注册表InitialKeyboardIndicators值  淘宝支付提示失败如何解决 淘宝支付流程优化方法  ArrayList与LinkedList操作复杂度详解:遍历与修改  j*a toString()的覆盖  抖音网页版快捷访问 抖音网页版网页版入口操作教程  TikTok国际版网页端快速入口 TikTok全球版短视频浏览教程  126邮箱手机版登录官网2026_126手机邮箱免费入口最新  如何在复杂的电商平台中优雅地管理共享资源并确保正确重定向,使用spryker-shop/resource-share-page模块助你一臂之力  MAC怎么安装Homebrew包管理器_MAC为开发者和高级用户安装命令行工具  谷歌邮箱网页版官方页面入口 谷歌邮箱网页端快速访问 

搜索