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
此事件發出的偵聽器在任何時間添加。當該事件被觸發,監聽器可能還冇有被添加到監聽的數組,用於該事件。 |
2 |
removeListener
此事件發出任何時當要刪除一個偵聽器。當該事件被觸發,監聽器可能還冇有被從監聽的陣列刪除,而用於在事件中刪除。 |
例子
創建一個名為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.