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類。

相關文章
相關標籤/搜索