了解 Node.js 的 EventEmitter:事件驱动编程的核心
在 Node.js 中,EventEmitter 是事件驱动编程的核心类之一。它提供了一种机制,可以让我们在应用中实现事件的触发和监听,帮助我们解耦不同的模块,使得代码更加清晰和灵活。本文将简要介绍 EventEmitter 类的基本概念和用法。
什么是 EventEmitter?
EventEmitter 是 Node.js 内建的一个类,用于处理事件及事件监听。在 Node.js 中,许多模块(例如文件操作、HTTP 请求等)都使用 EventEmitter 来触发和监听事件。通过这种机制,我们能够在某个事件发生时执行特定的回调函数。
如何使用 EventEmitter?
1. 引入 EventEmitter
首先,你需要引入 events 模块,才能使用 EventEmitter 类。
const EventEmitter = require('events');
2. 创建 EventEmitter 实例
接下来,我们可以创建一个 EventEmitter 的实例,通过它来管理事件和监听器。
const eventEmitter = new EventEmitter();
3. 监听事件
我们可以使用 on ,once或者addListener方法来监听某个事件。当事件被触发时,指定的回调函数就会被执行。
注:事件添加是放入数组的,所以如果同一个事件名,添加多次后不是覆盖之前的事件,而是在数组中有多个回调函数
eventEmitter.on('greet', () => {
console.log('Hello, Node.js!');
});
4. 触发事件
使用 emit 方法触发事件。当事件被触发时,所有监听这个事件的回调函数都会被执行。
eventEmitter.emit('greet'); // 输出:Hello, Node.js!
5. 移除事件监听器
如果不再需要监听某个事件,可以使用 removeListener,off或者removeAllListeners 方法移除监听器。
const greetListener = () => {
console.log('Hello, Node.js!');
};
eventEmitter.on('greet', greetListener);
eventEmitter.removeListener('greet', greetListener); // 移除监听器
示例:创建一个简单的事件系统
以下是一个简单的示例,展示了如何使用 EventEmitter 来模拟一个任务的完成事件。
const EventEmitter = require('events');
class Task extends EventEmitter {
constructor(name) {
super();
this.name = name;
}
start() {
console.log(`Task "${this.name}" started.`);
setTimeout(() => {
this.emit('completed', this.name);
}, 2000); // 模拟任务执行 2 秒后完成
}
}
const task = new Task('Download File');
task.on('completed', (taskName) => {
console.log(`Task "${taskName}" completed!`);
});
task.start(); // 启动任务