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