Event Bus 与观察者模式在 JavaScript (Node.js) 中的实现与示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Event Bus 与观察者模式在 JavaScript (Node.js) 中的应用



在现代 Node.js 开发中,经常需要组织应用程序组件之间的松耦合交互。观察者模式及其实际实现——Event Bus(事件总线)非常适合解决这个问题。在本文中,我们将详细探讨什么是 Event Bus,它如何与观察者模式相关联,并基于纯 JavaScript 为 Node.js 创建我们自己的实现。



什么是观察者模式?



观察者模式定义了对象之间一对多的关系。当一个对象(主体或发布者)改变其状态时,所有依赖它的对象(观察者或订阅者)都会自动收到通知。在 Node.js 中,此模式通过 EventEmitter 类内置于核心中。



该模式的主要组成部分:

  • Subject(主体) — 生成事件的对象。
  • Observer(观察者) — 订阅事件的对象。
  • Subscription(订阅) — 在主体处注册观察者的机制。


什么是 Event Bus?



Event Bus 是一个实现观察者模式的集中式中介。每个组件不直接订阅另一个组件,而是通过一个统一的事件总线进行通信。这带来了以下优势:

  • 组件之间的松耦合。
  • 无需修改发布者代码即可轻松添加新订阅者。
  • 能够集中管理事件(日志记录、过滤、调试)。


Node.js 中的内置 EventEmitter



Node.js 提供了一个内置的 events 模块,其中包含 EventEmitter 类。这是一个现成的 Event Bus 实现。让我们看一个基本示例:



const EventEmitter = require('events');const eventBus = new EventEmitter();

// 订阅 'user:login' 事件eventBus.on('user:login', (user) => { console.log(`用户 ${user.name} 已登录系统`);});

// 用另一个处理程序订阅eventBus.on('user:login', (user) => { console.log(`正在向 ${user.email} 发送欢迎邮件`);});

// 触发事件eventBus.emit('user:login', { name: '伊万', email: 'ivan@example.com' });// 输出:// 用户 伊万 已登录系统// 正在向 ivan@example.com 发送欢迎邮件


创建自己的 Event Bus



有时内置的 EventEmitter 是不够的——例如,如果需要添加对异步处理程序、优先级或严格类型检查的支持。让我们从零开始创建自己的 Event Bus 实现:



class EventBus {    constructor() {        this.events = {};    }

// 订阅事件 on(eventName, callback) { if (!this.events[eventName]) { this.events[eventName] = []; } this.events[eventName].push(callback); // 返回取消订阅的函数 return () => { this.events[eventName] = this.events[eventName] .filter(cb => cb !== callback); }; }

// 订阅一次性事件 once(eventName, callback) { const wrapper = (...args) => { callback(...args); this.off(eventName, wrapper); }; this.on(eventName, wrapper); }

// 触发事件 emit(eventName, ...args) { const callbacks = this.events[eventName]; if (!callbacks) return false; callbacks.forEach(callback => { try { callback(...args); } catch (error) { console.error(`事件 ${eventName} 的处理程序出错:`, error); } }); return true;

推荐