javascript简易pub/sub事件总线核心是用对象映射事件名与回调数组,支持on订阅、emit发布、off取消订阅、once一次性监听;推荐emit时浅拷贝数组避免遍历中修改问题,可选增强通配符,需注意回调引用一致性和错误隔离。

JavaScript 中实现一个简易的发布订阅(Pub/Sub)事件总线,核心是维护一个事件名到回调函数列表的映射,通过 on 订阅、emit 发布、off 取消订阅。不需要依赖外部库,原生 JS 就能轻松完成。
基础结构:用对象存事件监听器
用一个普通对象 events 作为“事件仓库”,键是事件名(字符串),值是该事件对应的回调函数数组:
例如:events = { click: [fn1, fn2], dataLoaded: [fn3] }
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 每次调用
on(eventName, callback),就把callback推入events[eventName]数组(若不存在则先初始化空数组) - 调用
emit(eventName, ...args)时,遍历对应数组,依次执行所有回调,并传入参数 -
off(eventName, callback)则从数组中移除指定回调(注意要支持只传事件名时清空全部监听器)
支持一次性监听(once)
很多场景只需要响应一次事件,比如初始化完成、首次加载成功。可以封装 once 方法:
- 内部调用
on,但注册的回调在执行后自动调用off删除自己 - 为避免在遍历中修改数组导致跳过后续回调,推荐在
emit时对监听器数组做浅拷贝再遍历:[...handlers]
支持通配符与事件命名空间(可选增强)
基础版只支持精确匹配事件名。如需更灵活控制,可引入简单通配逻辑:
- 约定用
*匹配任意一级(如user.*匹配user.login、user.logout) - 或用
**匹配多级(需额外解析路径,如api.**) - 实际项目中建议谨慎使用通配,优先靠清晰的事件命名(如
form:submit、form:reset)和模块隔离来管理复杂度
注意事项与健壮性处理
写一个真正可用的简易总线,还要考虑几个细节:
- 确保
on和off中的callback是同一个引用(不能传匿名函数后想取消) -
emit时检查事件是否存在,避免报错;也建议对回调执行加try/catch,防止一个失败影响其他监听器 - 如果需要跨实例通信,可导出单例;若用于类内部,可作为实例属性封装
- 不强制要求支持异步(如 Promise 回调),保持同步执行最符合直觉;如需异步,应显式提供
emitAsync
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










