EventEmitter对象

JavaScript 中,通过事件可以处理许多用户的交互,比如鼠标的单击、键盘按键的按下、对鼠标移动的反应等。在 Node.js 中也提供了类似的事件驱动,主要是通过 events 模块实现的,该模块中提供了 EventEmitter 类,用于处理事件。要使用 EventEmitter 类处理事件,首先需要对其进行初始化,代码如下:

EventEmitter = require('events')
eventEmitter = new EventEmitter()

Node.js 中,可以添加监听事件的对象都是继承自 EventEmitter 对象,后者提供了用于处理 Node.js 事件的方法,常用方法及说明如表 5.1 所示。

image 2024 04 08 23 29 06 639
Figure 1. 表5.1 EventEmitter 对象中的常用方法及说明

EventEmitter 对象的 addListener() 方法和 on() 方法都用来添加监听事件,它们的使用是等效的,实际上,on 方法在内部实现时调用了 addListener() 方法。Node.js 中推荐使用 on() 方法添加监听事件。

【例5.1】使用 EventEmitter 对象创建简单事件。(实例位置:资源包\源码\05\01)

WebStorm 中创建一个 .js 文件,其中创建一个 EventEmitter 对象,并使用其 on 方法添加监听事件,在监听事件中输出一个日志信息,然后使用 emit() 方法触发该监听事件。代码如下:

//引入events模块
var events = require('events');
//生成EventEmitter对象
var custom = new events.EventEmitter();
//添加监听事件tick
custom.on('tick', function (code) {
     console.log('执行指定事件!');
});
//主动触发监听事件tick
custom.emit('tick');

运行程序,效果如图 5.1 所示。

image 2024 04 08 23 30 59 184
Figure 2. 图5.1 使用 EventEmitter 对象创建简单事件

上面的代码中,使用 EventEmitter 对象添加监听事件和触发监听事件的代码都放在了一个文件中,但实际应用时,通常会把添加监听事件的模块和触发监听事件的模块分开,如图5.2所示就是一种常用的实现 Node.js 监听事件的文件构成方式。其中,app.js 文件中添加相关监听事件,rint.js 文件中触发相关监听事件。

image 2024 04 08 23 31 46 601
Figure 3. 图5.2 监听事件的文件构成

【例5.2】演示项目中监听事件的添加与触发。(实例位置:资源包\源码\05\02)

程序开发步骤如下。

(1) 在 WebStorm 中创建一个 rint.js 文件,该文件中使用 EventEmitter 对象的 emit() 方法每隔 1 秒触发一次 tick 事件,代码如下:

//定义变量,用来记录执行次数
num=0
//引入events模块
var events = require('events');
//生成 EventEmitter 对象
exports.timer = new events.EventEmitter();
//触发监听事件tick
setInterval(function () {
     num+=1
     exports.timer.emit('tick',num);
}, 1000);

(2) 创建一个 app.js 文件,为 rint 模块添加具体的 tick 事件,该事件中输出一个日志信息,代码如下:

//引入rint模块
var rint = require('./rint.js');
//添加监听事件
rint.timer.on('tick', function (code) {
     console.log(`执行第 ${code} 次监听事件`);
});

运行 app.js 文件,效果如图5.3所示。

image 2024 04 08 23 34 59 919
Figure 4. 图5.3 实际项目中监听事件的添加与触发