Node.js events 事件触发器模块
events 模块提供 EventEmitter 类,是 Node.js 事件驱动架构的基础。
引入模块
JavaScript
const EventEmitter = require('events');
创建事件发射器
JavaScript
const emitter = new EventEmitter();
// 注册事件监听器
emitter.on('message', (data) => {
console.log('收到消息:', data);
});
// 触发事件
emitter.emit('message', 'Hello World');
EventEmitter 常用方法
| 方法 | 说明 |
|---|---|
| on(event, listener) | 注册监听器(可多次触发) |
| once(event, listener) | 注册一次性监听器 |
| emit(event, ...args) | 触发事件 |
| removeListener(event, listener) | 移除监听器 |
| removeAllListeners([event]) | 移除所有监听器 |
| listeners(event) | 获取监听器列表 |
| listenerCount(event) | 获取监听器数量 |
一次性监听器
JavaScript
emitter.once('connect', () => {
console.log('首次连接');
});
emitter.emit('connect'); // 输出: 首次连接
emitter.emit('connect'); // 无输出,监听器已移除
移除监听器
JavaScript
function handler() {
console.log('handler');
}
emitter.on('test', handler);
// 移除特定监听器
emitter.removeListener('test', handler);
// 或使用别名
emitter.off('test', handler);
// 移除某事件所有监听器
emitter.removeAllListeners('test');
// 移除所有监听器
emitter.removeAllListeners();
移除监听器需要传入相同的函数引用,匿名函数无法移除。
前置监听器
JavaScript
emitter.on('order', () => console.log('第二执行'));
emitter.prependListener('order', () => console.log('第一执行'));
emitter.emit('order');
// 输出: 第一执行 -> 第二执行
自定义类继承 EventEmitter
JavaScript
const EventEmitter = require('events');
class User extends EventEmitter {
constructor(name) {
super();
this.name = name;
}
login() {
this.emit('login', this.name);
}
logout() {
this.emit('logout', this.name);
}
}
const user = new User('Tom');
user.on('login', (name) => {
console.log(`${name} 登录成功`);
});
user.on('logout', (name) => {
console.log(`${name} 已退出`);
});
user.login();
user.logout();
error 事件
JavaScript
// 必须监听 error 事件,否则进程会崩溃
emitter.on('error', (err) => {
console.error('捕获错误:', err.message);
});
emitter.emit('error', new Error('发生错误'));
// 未监听 error 时触发会导致异常退出
如果没有 error 监听器,触发 error 事件会使 Node.js 进程崩溃。
监听器数量限制
JavaScript
// 默认单个事件最多 10 个监听器
emitter.on('data', () => {});
emitter.on('data', () => {});
// ... 超过 10 个会警告
// 设置最大数量
emitter.setMaxListeners(20);
// 获取最大数量
console.log(emitter.getMaxListeners());
获取监听器信息
JavaScript
emitter.on('data', handler1);
emitter.on('data', handler2);
// 监听器数量
console.log(emitter.listenerCount('data')); // 2
// 监听器列表
console.log(emitter.listeners('data')); // [handler1, handler2]
// 所有事件名
console.log(emitter.eventNames()); // ['data']
要点总结
- EventEmitter 是 Node.js 事件驱动的基础类
- on 注册监听器,once 注册一次性监听器
- emit 触发事件,removeListener 移除监听器
- 自定义类继承 EventEmitter 可拥有事件能力
- 必须监听 error 事件避免进程崩溃
📝 发现内容有误?点击此处直接编辑