1. 简介
EventEmitter 是 Node.js 的一个核心模块,用于支持事件驱动编程的设计模式。该模块提供了一个事件触发与事件监听器功能的封装。当事件发生时,该模块会将数据推送给注册的监听器。这个模块是在 Node.js 的 EventEmitter 类基础上封装的,因此 Node.js 中的 EventEmitters 继承了 EventEmitter 类,可以通过 require('events') 引用。
2. 使用 EventEmitter
2.1 EventEmitter 类
在 Node.js 中,EventEmitter 类是事件模块的基础。所有基于事件的 Node.js 模块都依赖于它。其核心在于事件的触发和监听的封装。该模块实现了如下的事件函数:
on(eventName, listener):绑定事件
emit(eventName, [args]):触发事件
once(eventName, listener):一次性绑定事件
removeListener(eventName, listener):移除事件监听器
它允许进行自定义事件绑定和触发。下面是一个简单的例子:
const EventEmitter = require('events');
class myEmitter extends EventEmitter {};
const myEvent = new myEmitter();
myEvent.on('event', () => {
console.log('事件已经触发');
});
myEvent.emit('event');
这段代码为自定义事件进行监听和触发。在此例中,模块绑定了一个初始事件,当事件被触发时,控制台会输出字符串'事件已经触发'。这里的 on() 方法用于连接事件发生后的行为,emit() 方法用于触发事件。
2.2 触发事件
通过 emit() 函数,可以触发一个自定义事件,这需要事件的 name 和数据参数。例如,在以下代码中,我们定义了一个 newListener 事件,其会在添加新监听事件时被触发:
const EventEmitter = require('events');
class myEmitter extends EventEmitter {};
const myEvent = new myEmitter();
myEvent.on('newListener', (event, listener) => {
console.log('添加新监听事件:', event, listener);
});
一旦添加了新的监听器,newListener 事件即会在这个过程中被触发,输出信息"添加新监听事件: some-event [Function]"。
2.3 注册事件
除了在上述的绑定事件之外,我们还可以通过 removeAllListeners() 方法一次性移除所有监听器。该方法在事件结束时很有用。例如,像这样添加新的监听器,然后再次添加第二个监听器:
const EventEmitter = require('events');
class myEmitter extends EventEmitter {};
const myEvent = new myEmitter();
myEvent.on('eventNew', () => {
console.log('新事件已经被触发');
});
myEvent.on('eventNew', () => {
console.log('另一个新事件被触发');
});
myEvent.emit('eventNew');
这里,我们触发 eventNew 事件,并添加了两个监听器。输出结果应该是:
新事件已经被触发
另一个新事件被触发
如果我使用 removeListener(eventName, listener) 方法来移除第二个监听器,那么就不会输出上述的"另一个新事件被触发"了。例如:
const EventEmitter = require('events');
class myEmitter extends EventEmitter {};
const myEvent = new myEmitter();
function newEvent() {
console.log('新事件已经被触发')
}
function anotherEvent() {
console.log('另外一个新事件被触发')
}
myEvent.on('eventNew', newEvent);
myEvent.on('eventNew', anotherEvent);
myEvent.emit('eventNew');
myEvent.removeListener('eventNew', anotherEvent);
myEvent.emit('eventNew');
运行这段代码,输出结果为:
新事件已经被触发
另外一个新事件被触发
新事件已经被触发
2.4 一次性事件
除了 on() 方法之外,EventEmitter 还提供了一次性事件注册的方法:once(),该方法在第一次执行期间立即删除。这个方法是一次性绑定事件,只会执行一次并删除。例如:
const EventEmitter = require('events');
class myEmitter extends EventEmitter {};
const myEvent = new myEmitter();
myEvent.once('newListener', (event, listener) => {
console.log('只会输出一次:' + event + ' 添加新监听器');
});
myEvent.on('newListener', (event, listener) => {
console.log(event + ' 添加新监听器, 每次添加都会输出 ');
});
myEvent.emit('newListener');
myEvent.emit('newListener');
第一次输出"只会输出一次:newListener 添加新监听器”,因为一次性事件已在第一次触发后被删除,而后在添加了新事件监听者时仍会触发监听器,输出两次事件信息"newListener 添加新监听器,每次添加都会输出"。
3. 总结
通过本文,我们基本上掌握了 Node.js 中 EventEmitter 的使用方法,该模块是 Node.js 中实现事件交互的基本方式之一。