在node
中有一个核心的概念就是事件,不少的node
模块都是基于事件的。事件就是提示程序中发生了什么的信号。node
例如node
中的http
模块,它是能够用来建立网络服务的。咱们监听给定的端口,每次咱们在这个端口获得请求,http
类就会发起一个事件,咱们的工做就是响应这个事件,具体说就是读取请求内容并给出对应的反馈。在node
的官方文档中也能够看到不一样的模块发起不一样的事件,咱们的代码就是关心如何反馈这些事件。编程
回到node
官方文档,在列表中看到有Event
模块,模块里有个类叫作EventEmitter
。这是node
的核心模块之一,不少类是基于这个EventEmitter
类的。 bash
emitter
设置为一个
EventEmitter
对象,在实际应用中会使用到。
emit
就遍历了全部的监听器。这就是发起事件和处理用
EventEmitter
类来处理事件的基本内容。
常常咱们在发起时间的时候想带点数据,例如在另外一个logger
模块中当咱们记录日志时,咱们的服务可能想建立一个日志的编号以后再返回给客户端。或者给它一个url
,能够直接访问日志的信息。因此在上面的发起事件中,能够带一个参数做为事件的参数。 网络
在现实编程中不多直接使用EventEmitter
,相反都会建立一个类拥有全部EventEmitter
的功能而后使用它。app
如今建立一个文件logger
,写入如下的代码。在这个模块中咱们导出了logger
函数。 编辑器
app
模块中我想监听而后作点事。导入
EventEmitter
到模块中,建立实例对象在应用中使用。在
logger
模块中发起事件。
app
模块中注册监听器,接受返回的信息。
EventEmitter
,天然建立的实例对象也只是做用与当前文件或是模块内。那么怎么办呢?
这里就要建立一个继承并扩展EventEmitter
全部能力的类。这里咱们建立一个Logger
的类,而且拥有一个扩展的log
方法。使用到ES6
中的class
。函数
分别改造下logger.js
和app.js
文件的代码ui
//引入模块
const EventEmitter = require('events');
let url = 'http://mylogger.io/log';
class Logger extends EventEmitter {
log(message) {
//发送http请求
console.log(message);
//emit是用来发起一个事件的
this.emit('messageLogged', {
id: 1,
url
});
}
}
module.exports = Logger;
复制代码
//引入模块
const Logger = require('./logger');
const logger = new Logger();
//注册一个监听器,接收返回的信息
logger.on('messageLogged', (result) => {
console.log('监听成功');
console.log(result);
})
logger.log('hello node');
复制代码
从新在控制台执行下,成功了 this
若是你想在程序中使用监听器来监测某个事件的发生,你须要建立一个扩展自EventEmitter
的类,这样这个类就具备了EventEmitter
全部的功能,同时你也能够添加任何自定义的功能。而在类中,若是你想发起事件,就使用emit
方法。上面的this
关联到本身,也就是从EventEmitter
扩展出来的类,因此只要在EventEmitter
中定义的成员也会包含于新的类中。url
最后在app
模块中,以前使用EventEmitter
的对象,如今可使用新的类定义一个实例对象。这个类扩展自EventEmitter
类。