EventEmitter
Node.js 事件驱动架构的核心:EventEmitter 模式的定义、使用与原理。
#type / concept
#status / growing
#resource / nodejs
#resource / javascript
[!info] related notes
- 所属 MOC: nodejs-moc
- 相关概念: js-event-loop
- 应用场景: stream, fs, http
EventEmitter
Node.js 核心 API 很多都建立在 EventEmitter 之上,它是事件驱动架构的基础。
一句话定义
EventEmitter 是一个发布-订阅模式的实现:对象触发事件,监听器响应该事件。
核心 API
import { EventEmitter } from 'node:events';
const bus = new EventEmitter();
// 注册监听器
bus.on('message', (data) => {
console.log('收到:', data);
});
// 触发事件
bus.emit('message', 'hello');
// 一次性监听
bus.once('init', () => {
console.log('只执行一次');
});
// 移除监听器
bus.off('message', handler);
核心方法
| 方法 | 说明 |
|---|---|
on(event, fn) | 注册监听器 |
once(event, fn) | 一次性监听 |
emit(event, ...args) | 触发事件 |
off(event, fn) | 移除监听器 |
removeAllListeners(event) | 移除全部 |
Node.js 中哪些模块用到了它
fs的文件监视http的请求/响应stream的数据事件process对象net的连接事件
自定义业务事件总线
const bus = new EventEmitter();
bus.on('orderCreated', (order) => {
console.log('处理订单', order.id);
});
bus.on('orderCreated', (order) => {
console.log('发送通知');
});
bus.emit('orderCreated', { id: 123 });
最容易误解的点
- EventEmitter 不是 Node 独有的设计,浏览器中也有类似模式
- 同一个事件可以注册多个监听器,按注册顺序执行
- 忘记移除监听器会导致内存泄漏
放回主题图里看
- 事件循环:js-event-loop
- 流(Stream)也是 EventEmitter:stream
- 进程对象也是 EventEmitter:process-thread-coroutine