EventEmitter对象
在 JavaScript 中,通过事件可以处理许多用户的交互,比如鼠标的单击、键盘按键的按下、对鼠标移动的反应等。在 Node.js 中也提供了类似的事件驱动,主要是通过 events
模块实现的,该模块中提供了 EventEmitter
类,用于处理事件。要使用 EventEmitter
类处理事件,首先需要对其进行初始化,代码如下:
EventEmitter = require('events')
eventEmitter = new EventEmitter()
在 Node.js 中,可以添加监听事件的对象都是继承自 EventEmitter
对象,后者提供了用于处理 Node.js 事件的方法,常用方法及说明如表 5.1 所示。

|
【例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 所示。

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

【例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所示。
