node.js中的EventEmitter

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 中实现事件交互的基本方式之一。