新闻中心

j*ascript_如何实现发布订阅模式

2025-12-02
浏览次数:
返回列表
发布订阅模式通过事件中心解耦发送者与接收者,核心为on、emit、off方法,实现事件的订阅、发布与取消,适用于组件通信、状态管理等场景。

javascript_如何实现发布订阅模式

发布订阅模式是一种经典的设计模式,适用于解耦事件的发送者和接收者。在 J*aScript 中实现发布订阅模式,核心是创建一个事件中心,允许对象订阅特定事件,并在事件被触发时通知所有订阅者。

定义事件中心

事件中心是发布订阅模式的核心,它负责管理事件的注册、触发和移除。你可以通过一个简单的对象来实现:

on(event, callback):订阅事件,将回调函数添加到对应事件的队列中。
emit(event, data):发布事件,执行该事件下所有订阅的回调函数,并传入数据。
off(event, callback):取消订阅,从事件队列中移除指定的回调函数。

示例代码:

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);
    }
  }
}

使用示例

创建一个事件中心实例,然后让不同部分订阅和发布消息:

const eventBus = new EventEmitter();

// 订阅事件
eventBus.on('userLogin', user => {
  console.log('欢迎 ' + user.name);
});

eventBus.on('userLogin', user => {
  console.log('更新用户状态:' + user.status);
});

// 发布事件
eventBus.emit('userLogin', { name: 'Alice', status: 'online' });

输出结果:

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

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

睿拓智能网站系统-网上商城 0 查看详情 睿拓智能网站系统-网上商城
欢迎 Alice
更新用户状态:online

支持取消订阅

为了避免内存泄漏或重复执行,可以移除不再需要的订阅:

function welcome(user) {
  console.log('欢迎 ' + user.name);
}

eventBus.on('userLogin', welcome);

// 取消订阅
eventBus.off('userLogin', welcome);

这样,welcome 函数不会再被调用。

实际应用场景

组件通信:在前端框架中,父子组件或兄弟组件可通过事件中心通信。
状态管理:全局状态变化时通知多个视图更新。
异步任务协调:某个异步操作完成后通知多个监听者。

基本上就这些。发布订阅模式在 J*aScript 中实现简单,却非常实用。只要掌握 on、emit、off 三个方法的逻辑,就能灵活运用在各种场景中。不复杂但容易忽略细节,比如重复订阅或忘记解绑。

以上就是j*ascript_如何实现发布订阅模式的详细内容,更多请关注其它相关文章!


# 永州  # 石嘴山网站优化排名推广  # 静海网站建设的方式  # 旅游网站建设制作  # 承德一站式网站建设好处  # 廊坊营销网站建设好处  # 湖北论坛营销推广品牌  # 百度推广刷流量网站  # 望城区营销网站建设  # 无极智能网站建设资费  # 营销推广策略的研究背景  # 运行环境  # 情况下  # 发布订阅模式  # 最新产品  # 创建一个  # 适用于  # 移除  # 多个  # 如何实现  # 回调  # 异步任务  # 回调函数  # 前端  # java  # javascript 


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


相关推荐: CSS布局中意外空白:解决padding-top导致的顶部间距问题  Lar*el如何生成PDF或Excel文件_Lar*el文档导出工具与使用教程  谷歌浏览器一键优化方案_谷歌浏览器直达主页极速不卡版  解决Rails应用中内容错位与Turbo警告:meta标签误用导致富文本渲染异常  Log4j Console Appender性能瓶颈与高并发优化策略  漫蛙manwa官网登录界面_漫蛙漫画网页版主站入口  Python getattr() 异常处理深度解析:避免程序意外退出  微信群消息显示延迟如何解决 微信群消息刷新优化方法  蛙漫安全无毒 官方认证的绿色入口  C++ vector二维数组定义_C++ vector of vector用法  在Go开发中优雅管理ListenAndServe进程:GoSublime集成方案  优酷会员付费后没到账怎么办_优酷会员充值异常及解决方法  如何将HTML表格多行数据保存到Google Sheets  composer的"require-dev"部分是用来做什么的?  C++ typeid如何获取类型信息_C++ RTTI运行时类型识别用法  Pygame教程:解决用户输入与游戏状态更新不同步问题  UC浏览器官网入口2025最新 UC浏览器网页版正式地址  Python多线程中正确使用sigwait处理SIGALRM信号  QQ邮箱网页版登录入口 QQ邮箱官方在线使用平台  知音漫客官网漫画下载_知音漫客网页版阅读记录  Angular中单选按钮的正确使用与常见陷阱解析  Win11怎么关闭触摸屏_Windows 11禁用HID符合标准触摸屏  必由学官网首页入口 必由学教师网页版登录指南  J*a应用程序首次运行自动创建文件与目录的最佳实践  J*a 递归快速排序中静态变量的状态管理与陷阱  C++如何打印当前代码行号与文件名_C++预定义宏FILE与LINE的使用  小红书怎么解除第三方平台绑定_小红书多平台登录解绑方法介绍  如何解决电商平台定制报价请求的“黑洞”问题,SprykerQuoteRequest模块助你提升客户体验与销售效率  俄罗斯Yandex免登录入口_Yandex搜索引擎官网一键直达  Kafka Streams中基于消息头条件过滤消息的实现指南  C++ map遍历方法大全_C++ map迭代器使用总结  QQ邮箱官方网站登录入口_QQ邮箱网页版在线使用  钉钉视频会议画面卡顿如何解决 钉钉会议画面优化方法  深入理解rpy2中的类型转换:优化Python对象到R矩阵的映射  Golang如何实现Web文件静态资源服务器_Golang静态资源服务器开发与实践  字由网在线版登录地址 字由网网页版安全入口  中兴BladeV30怎样用测距估书架层高_iPhone中兴BladeV30测距估书架层高【家装参考】  HTML元素状态管理:根据DIV内容动态启用/禁用按钮  漫蛙2(台版)官方入口地址 漫蛙2(台版)正版漫画网页端  《明末:渊虚之羽》设计师谈设计角色:那会刚毕业 充满激情  三星ZFold5多任务卡顿_Samsung ZFold5流畅度提升  在Socket.IO连接中实现Access Token自动更新与动态重连  曝R星经典之作开发图 设计简陋但信息密集!  J*aScript打印功能_j*ascript输出控制  lar*el怎么安全地存储和获取配置文件中的敏感信息_lar*el敏感信息安全存储方法  抖音小游戏合成大西瓜免费秒玩入口链接 抖音小游戏热门合集秒玩网站  我的世界官方游戏入口 我的世界官网平台直达链接  Excel如何用迷你图显趋势_Excel用迷你图显趋势【趋势小图】  Python中高效且防溢出的双曲正弦计算:基于对数空间的优化策略  Golang如何实现Web接口签名验证_Golang Web接口签名校验开发方法 

搜索