Node.js事件發射器


在Node很多物件發出事件,例如net.Server每個同級連線到它,一個fs.readStream發出開啟檔案事件時,每次都發出一個事件。 它發出事件的所有物件都是events.EventEmitter的範例。

EventEmitter 類

正如我們已經看到在上一節,EventEmitter類在於事件的模組。它是通過通俗易懂的語法如下:

// Import events module
var events = require('events');
// Create an eventEmitter object
var eventEmitter = new events.EventEmitter();

EventEmitter範例對任何錯誤,它會發出一個“error”事件。當新的偵聽器被新增,“newListener'事件被觸發,當一個偵聽器被刪除,'removeListener”事件被觸發。

EventEmitter提供多種效能如在發射。On屬性用於系結事件函式,發射用於觸發一個事件。

方法

S.N. 方法 & 描述
1 addListener(event, listener)
新增一個監聽器監聽器陣列指定事件的結束。沒有進行檢查,以檢視是否偵聽器已經新增。多次呼叫傳遞事件和監聽器的相同組合,將導致在偵聽器被新增多次。返回發射器,所以呼叫可以連結。
2 on(event, listener)
新增一個監聽器監聽器陣列在未尾指定事件. 沒有進行檢查,以檢視是否偵聽器已經新增。多次呼叫傳遞事件和監聽器的相同組合,將導致在偵聽器被新增多次。返回發射器,所以呼叫可以連結。
3 once(event, listener)
增加一次監聽事件。 監聽器呼叫僅在下一次事件被觸發,之後被刪除。返回發射器,所以呼叫可以連結。
4 removeListener(event, listener)
從偵聽器陣列指定事件刪除監聽器。注意:改變陣列索引偵聽器後面監聽器陣列中。removeListener將從監聽陣列中刪除至多偵聽器一個範例。如果任何一個監聽器已經被多次新增到偵聽陣列指定事件,然後removeListener必須多次刪除每個範例。返回發射器,所以呼叫可以連結。
5 removeAllListeners([event])
刪除所有監聽器,或者那些指定的事件。這不是一個好主意,刪除在其他地方新增程式碼,特別是當它在還沒有建立(如通訊端或檔案流)發射器監聽器。 返回發射器,所以呼叫可以連結。
6 setMaxListeners(n)
預設情況下EventEmitters將列印一個警告,如果超過10個監聽器新增特定事件。這是一個有用的預設這有助於發現記憶體洩漏。顯然,並非所有的發射器應限制在10個,此功能允許增加。設定為零無限制。
7 listeners(event)
返回監聽器為指定事件的陣列。
8 emit(event, [arg1], [arg2], [...])
為了與提供的引數執行每一個監聽器。如果事件有監聽器返回true,否則為false。

類方法

S.N. 方法 & 描述
1 listenerCount(emitter, event)
返回對於一個給定的事件監聽器的數量。

事件

S.No. 事件 & 描述
1 newListener
  • event - 事件字串名稱

  • listener - 函式的事件處理常式

此事件發出的偵聽器在任何時間新增。當該事件被觸發,監聽器可能還沒有被新增到監聽的陣列,用於該事件。

2 removeListener
  • event - 字串事件名稱

  • listener - 函式的事件處理常式

此事件發出任何時當要刪除一個偵聽器。當該事件被觸發,監聽器可能還沒有被從監聽的陣列刪除,而用於在事件中刪除。

例子

建立一個名為main.js,使用以下Node.js的程式碼js檔案:

var events = require('events');
var eventEmitter = new events.EventEmitter();

// listener #1
var listner1 = function listner1() {
   console.log('listner1 executed.');
}

// listener #2
var listner2 = function listner2() {
  console.log('listner2 executed.');
}

// Bind the connection event with the listner1 function
eventEmitter.addListener('connection', listner1);

// Bind the connection event with the listner2 function
eventEmitter.on('connection', listner2);

var eventListeners = require('events').EventEmitter.listenerCount(eventEmitter,'connection');
console.log(eventListeners + " Listner(s) listening to connection event");

// Fire the connection event 
eventEmitter.emit('connection');

// Remove the binding of listner1 function
eventEmitter.removeListener('connection', listner1);
console.log("Listner1 will not listen now.");

// Fire the connection event 
eventEmitter.emit('connection');

eventListeners = require('events').EventEmitter.listenerCount(eventEmitter,'connection');
console.log(eventListeners + " Listner(s) listening to connection event");

console.log("Program Ended.");

現在執行main.js看到的結果:

$ node main.js

驗證輸出

2 Listner(s) listening to connection event
listner1 executed.
listner2 executed.
Listner1 will not listen now.
listner2 executed.
1 Listner(s) listening to connection event
Program Ended.