Node事件模块

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.jsapp.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类。

相关文章
相关标签/搜索