如何实现一个J*aScript的Pub/Sub模式_j*ascript设计模式


答案:通过创建事件中心实现订阅、发布和取消功能,支持模块间解耦通信。使用 events 对象存储事件与回调映射,subscribe 添加监听,publish 触发执行,unsubscribe 移除监听,并可扩展 once、通配符等特性提升实用性。

如何实现一个javascript的pub/sub模式_javascript设计模式

发布-订阅模式(Pub/Sub)是一种广泛使用的通信模式,特别适合解耦组件之间的依赖关系。在J*aScript中,它常用于事件系统、状态管理或模块间通信。实现一个轻量但功能完整的Pub/Sub系统并不复杂,核心是维护一个事件中心,支持订阅、发布和取消订阅。

定义事件中心

创建一个独立的对象或类来管理所有事件。这个中心负责存储回调函数(订阅者),并在事件触发时通知它们(发布消息)。

使用一个对象来保存事件名与对应回调函数的映射关系:

const pubSub = {

  events: {},

  // 订阅事件

  subscribe: function (event, callback) {

    if (!this.events[event]) {

      this.events[event] = [];

    }

    this.events[event].push(callback);

  },

  // 发布事件

  publish: function (event, data) {

    if (!this.events[event]) return;

    this.events[event].forEach(callback => callback(data));

  },

  // 取消订阅

  unsubscribe: function (event, callback) {

    if (!this.events[event]) return;

    this.events[event] = this.events[event].filter(cb => cb !== callback);

  }

};

使用示例

通过简单的调用即可实现模块间的松耦合通信。

// 订阅用户登录事件

简洁清爽的jQuery单页个人网站模板 简洁清爽的jQuery单页个人网站模板

Guru简约现代风格,响应式个人介绍类网站模板。这个模板适用于任何一个有创造力的人的个人网站。他的模板是非常干净和简单的设计

简洁清爽的jQuery单页个人网站模板 92 查看详情 简洁清爽的jQuery单页个人网站模板

pubSub.subscribe('userLogin', function(userData) {

  console.log('欢迎 ' + userData.name);

});

// 另一个订阅者

function logTime(data) {

  console.log('登录时间:' + new Date().toLocaleString());

}

pubSub.subscribe('userLogin', logTime);

// 发布事件

pubSub.publish('userLogin', { name: 'Alice' });

// 控制台输出:

// 欢迎 Alice

// 登录时间:2025/4/5 下午3:20:00

增强功能建议

实际项目中可扩展以下特性提升实用性:

  • 支持一次*件(once):监听器执行一次后自动移除
  • 通配符订阅:如 'user.*' 匹配所有以 user 开头的事件
  • 命名空间隔离:多个实例避免全局污染
  • 错误处理:捕获回调中的异常,防止中断其他订阅者

例如添加 once 方法:

once: function (event, callback) {

  const onceWrapper = (data) => {

    callback(data);

    this.unsubscribe(event, onceWrapper);

  };

  this.subscribe(event, onceWrapper);

}

基本上就这些。一个简洁的Pub/Sub系统能极大提升代码组织性,尤其在前端组件通信或状态变化通知场景中非常实用。关键是保持接口清晰,逻辑简单可靠。

以上就是如何实现一个J*aScript的Pub/Sub模式_j*ascript设计模式的详细内容,更多请关注其它相关文章!


# 适用于  # 新蔡抖音关键词排名  # seo优化 pdf  # 线上营销推广哪里好  # 巴中全网营销推广收费  # 公司网站建设一年多少钱  # 品牌网站建设课程介绍  # 学校科研网站建设流程  # 商务网站如何建设  # 邢台国外网站建设  # 常德网站建设招商项目  # 中文网  # 相关文章  # 并在  # pub/sub  # 多个  # 是一种  # 的人  # 移除  # 回调  # 如何实现  # 2025  # 回调函数  # app  # 前端  # java  # javascript 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894 】


相关推荐: 《豆瓣》私信用户方法  铁路12306买票怎么选双人铺 铁路12306卧铺分配规则说明  Linux如何优化系统启动流程_Linux启动项优化方案  英雄联盟争者留名活动介绍  蜻蜓FM如何设置移动流量播放  漫蛙manwa漫画官网链接_漫蛙manwa最新可用网址推荐  《知到》打卡课程方法  济南公交卡手机充值指南  在PySimpleGUI中实现键盘按键绑定按钮事件  C++ static关键字作用_C++静态成员变量与静态函数  铁路12306怎么申请退票_铁路12306退票申请操作流程  263企业邮箱如何设置邮件转发功能  豆包AI怎样为教育场景定制答疑逻辑_为教育场景定制豆包AI答疑逻辑方案【方案】  深入理解Python对象引用与链表属性赋值  Python自动化抓取GBGB赛狗比赛结果:日期范围与赛道筛选教程  虫虫助手如何更新游戏  国际经济与贸易就业方向解析  C++ switch case字符串_C++如何实现字符串switch匹配  如何查询国外邮政编码_国外邮政编码查询的多种有效途径  POKI小游戏在线免费入口链接 POKI小游戏无下载秒玩玩  Golang如何测试结构体方法_Golang reflect方法测试与调用技巧  如何在CSS中使用过渡制作按钮边框渐变_border-color transition实现  如何在mysql中比较InnoDB和MyISAM区别  sf漫画官网登录入口直达_sf漫画官方正版网址  cad视图选项卡不见了怎么办_cad视图标签恢复显示方法  创客贴登录页面入口 创客贴网页版最新网址链接  CodeIgniter 3 中基于 MySQL 数据高效生成动态图表教程  虫虫漫画绿色安全入口_虫虫漫画绿色安全入口安全看漫画  《小黑盒》删除历史浏览方法  抖音火山版注销账号抖音会注销吗 抖音火山版与抖音账号注销关系  企查查官网和爱企查 企查查企业查询官网入口  泰拉瑞亚网页版在线登录入口 泰拉瑞亚官方正版入口  《小宇宙》标记不友善评论方法  聚水潭ERP后台管理系统登录 聚水潭ERP官方登录通道  美发店速赢秘籍  银信通自动开通原因揭秘  解决CSS background 属性中 cover 关键字的常见误用  macosmonterey系统外接显示器驱动怎么安装_macosmonterey外接显示器驱动与分辨率调整  j*a中ArrayBlockingQueue的使用  VS Code如何设置默认配置  《下一站江湖2》风神腿获取攻略  J*aScript深度克隆:实现高效、健壮与安全的复杂对象复制  如何在CSS中使用absolute实现登录弹窗居中_transform translate结合  Go语言反射机制:如何访问被嵌入结构体遮蔽的方法  解决jQuery多计算器输入字段冲突的教程  百度网盘如何设置上传限额  冬季去寒冷地区旅游,以下哪种做法有助于缓解冻伤  《顺丰同城骑士》查看我的技能方法  《蓝色星原:旅谣》坐骑获取攻略  Apple Music无故扣费引质疑 

 2025-11-04

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.