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