JavaScript事件总线通过对象存储事件名与回调数组映射,提供on(订阅)、emit(发布)、off(取消订阅)三方法,支持错误捕获,轻量无依赖。

JavaScript 中实现一个简单的事件总线,核心是提供 订阅(on)、发布(emit) 和 取消订阅(off) 三个能力,用一个对象维护事件名与回调函数的映射关系即可,不需要依赖外部库。
基础结构:用对象存事件监听器
每个事件名(如 "user:login")对应一个函数数组,每次调用 on 就往对应数组里推入回调;emit 时遍历执行该数组里的所有函数。
- 用
Map或普通对象({})都行,对象更简洁,适合简单场景 - 注意避免重复添加同一函数(可选),或允许重复(更灵活)
- 建议对回调执行做简单错误捕获,防止一个报错阻断后续回调
实现 on / emit / off 三个方法
下面是一个轻量、可直接使用的版本:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
class EventBus {
constructor() {
this.events = {};
}
on(type, callback) {
if (!this.events[type]) {
this.events[type] = [];
}
this.events[type].push(callback);
}
emit(type, ...args) {
const callbacks = this.events[type];
if (Array.isArray(callbacks)) {
callbacks.forEach(cb => {
try {
cb(...args);
} catch (e) {
console.error('Event callback error:', e);
}
});
}
}
off(type, callback) {
const callbacks = this.events[type];
if (Array.isArray(callbacks)) {
const index = callbacks.indexOf(callback);
if (index > -1) {
callbacks.splice(index, 1);
}
}
}
}
// 使用示例
const bus = new EventBus();
bus.on('data:loaded', (data) => console.log('Received:', data));
bus.on('data:loaded', (data) => alert('Updated UI'));
bus.emit('data:loaded', { id: 1, name: 'Alice' });
// → 控制台输出 + 弹窗
可选增强点(按需添加)
如果项目稍复杂,可以加这些小改进,不破坏简洁性:
立即学习“Java免费学习笔记(深入)”;
-
once 方法:注册只触发一次的监听器,内部在执行后自动调用
off -
offAll 方法:清空某类事件的所有监听器,或清空全部(
offAll()) -
支持通配符或正则匹配事件名(如
user.*),适合中大型模块通信 -
返回移除函数:让
on返回一个off函数,方便在组件卸载时清理(类似 React 的 cleanup)
实际使用注意
事件总线容易引发隐式耦合和内存泄漏,所以要注意:
- 尽量限定作用域,比如组件内创建局部 bus,而不是全局单例
- 在组件销毁、页面离开前主动调用
off,尤其监听了异步回调时 - 事件名建议用命名空间格式(如
auth:login-success),避免冲突 - 不推荐在大型应用中过度依赖事件总线替代状态管理,它更适合解耦松散、跨层级通知类场景

















