Node.js 中的 Event
模块是实现事件驱动编程的核心模块。它基于观察者模式,允许对象(称为“事件发射器”)发布事件,而其他对象(称为“事件监听器”)可以订阅并响应这些事件。这种模式非常适合处理异步操作和事件驱动的场景。
事件驱动编程是一种编程范式,程序的执行流程由事件(如用户输入、文件读取完成、网络请求响应等)决定。Node.js 的核心设计理念就是基于事件驱动的非阻塞 I/O 模型。
EventEmitter
是 Node.js 中实现事件驱动编程的核心类。它提供了以下功能:
emit()
方法触发事件。on()
或 addListener()
方法监听事件。removeListener()
或 off()
方法移除事件监听器。EventEmitter
EventEmitter
是 events
模块的一个类,使用前需要引入:
const EventEmitter = require('events');
可以通过继承 EventEmitter
或直接实例化来创建事件发射器。
const EventEmitter = require('events');
// 创建事件发射器实例
const myEmitter = new EventEmitter();
// 监听事件
myEmitter.on('greet', (name) => {
console.log(`Hello, ${name}!`);
});
// 触发事件
myEmitter.emit('greet', 'Alice'); // 输出:Hello, Alice!
EventEmitter
const EventEmitter = require('events');
// 自定义类继承 EventEmitter
class MyEmitter extends EventEmitter {}
// 创建自定义类的实例
const myEmitter = new MyEmitter();
// 监听事件
myEmitter.on('greet', (name) => {
console.log(`Hello, ${name}!`);
});
// 触发事件
myEmitter.emit('greet', 'Bob'); // 输出:Hello, Bob!
on(eventName, listener)
eventName
:事件名称。listener
:事件触发时的回调函数。myEmitter.on('data', (data) => {
console.log('Data received:', data);
});
emit(eventName[, ...args])
eventName
:事件名称。args
:传递给监听器的参数。myEmitter.emit('data', { message: 'Hello, world!' });
once(eventName, listener)
myEmitter.once('init', () => {
console.log('Initialized!');
});
myEmitter.emit('init'); // 输出:Initialized!
myEmitter.emit('init'); // 无输出
removeListener(eventName, listener)
const listener = (data) => {
console.log('Data received:', data);
};
myEmitter.on('data', listener);
myEmitter.removeListener('data', listener);
off(eventName, listener)
removeListener
的别名,功能相同。removeAllListeners([eventName])
myEmitter.removeAllListeners('data');
listenerCount(eventName)
const count = myEmitter.listenerCount('data');
console.log('Listener count:', count);
fs
、net
、http
)都基于 EventEmitter
。error
事件,可能会导致程序崩溃。始终监听 error
事件,避免未捕获的错误导致程序崩溃。
myEmitter.on('error', (err) => {
console.error('Error occurred:', err.message);
});
myEmitter.emit('error', new Error('Something went wrong!'));
及时移除不再需要的监听器。
const listener = () => {
console.log('Event triggered');
};
myEmitter.on('event', listener);
// 移除监听器
myEmitter.off('event', listener);
once
替代 on
如果事件只需要触发一次,使用 once
而不是 on
,避免手动移除监听器。
myEmitter.once('init', () => {
console.log('Initialized!');
});
以下是一个结合 fs
模块的文件读取示例:
const fs = require('fs');
const EventEmitter = require('events');
class FileReader extends EventEmitter {
readFile(filePath) {
fs.readFile(filePath, 'utf8', (err, data) => {
if (err) {
this.emit('error', err);
} else {
this.emit('data', data);
}
});
}
}
const reader = new FileReader();
reader.on('data', (data) => {
console.log('File content:', data);
});
reader.on('error', (err) => {
console.error('Failed to read file:', err.message);
});
reader.readFile('example.txt');
EventEmitter
是 Node.js 中实现事件驱动编程的核心工具。通过合理使用 EventEmitter
,可以编写出高效、模块化的 Node.js 应用程序。