答案:通过设计on、emit、off方法实现事件的监听、触发与移除,使用对象存储事件回调映射,支持解耦通信,并可扩展通配符、once、清空等功能,适用于组件或模块间交互。

实现一个完整的 Publish/Subscribe(发布/订阅)事件系统,核心是解耦事件的发送者和接收者。通过 javaScript 可以轻松构建一个支持监听、触发和移除事件的模块。以下是具体实现方式。
1. 基本结构设计
一个典型的 Pub/Sub 系统需要支持以下功能:
- on(Event, callback):注册事件监听器
- emit(event, data):触发事件并传递数据
- off(event, callback):移除指定事件的监听器
使用一个对象来存储事件名到回调函数数组的映射,是常见做法。
2. 完整代码实现
function createPubSub() {
const events = {};
// 订阅事件
function on(event, callback) {
if (!events[event]) {
events[event] = [];
}
events[event].push(callback);
}
// 发布事件
function emit(event, data) {
if (!events[event] || events[event].Length === 0) return;
events[event].foreach(callback => callback(data));
}
// 移除监听器
function off(event, callback) {
if (!events[event]) return;
const index = events[event].indexOf(callback);
if (index !== -1) {
events[event].splice(index, 1);
}
}
return { on, emit, off };
}
3. 使用示例
创建实例并绑定事件:
立即学习“Java免费学习笔记(深入)”;
const pubsub = createPubSub();
// 监听用户登录事件
pubsub.on(‘login’, user => {
console.log(‘欢迎 ‘ + user.name);
});
// 触发登录
pubsub.emit(‘login’, { name: ‘Alice’ }); // 输出:欢迎 Alice
可以绑定多个回调,也可以移除特定监听:
const handler = () => console.log(‘只执行一次’);
pubsub.on(‘init’, handler);
pubsub.emit(‘init’); // 触发
pubsub.off(‘init’, handler); // 移除
4. 扩展功能建议
可根据需求增强系统能力:
- 支持通配符事件(如 user.*)
- 添加 once(event, callback) 实现一次性监听
- 提供 clear(event) 清空某个事件的所有监听
- 增加事件命名空间管理
这类系统广泛应用于组件通信、状态管理或跨模块解耦场景。
基本上就这些,不复杂但容易忽略细节,比如正确处理不存在的事件或重复移除的问题。


