參考內容:
Node.js EventEmitter
四、Node.js EventEmitter
Node.js所有異步I/O操作在完成時都會發送一個事件到事件隊列;
Node.js里許多對象都會分發事件:一個net.Server對象會在每次有新連接時分發一個事件,一個fs.readStream對象會在文件被打開時發出一個事件。所有這些產生事件的對象都是events.EventEmitter的實例。
EventEmitter類
- events模塊只提供了一個對象:events.EventEmitter,它的核心是事件觸發與事件監聽器功能的封裝。可以通過
require('events');
來訪問該模塊。
// 引入events模塊
var events = require('events');
// 創建eventEmitter對象
var eventEmitter = new events.EventEmitter();
- EventEmitter對象如果在實例化時發生錯誤,會觸發error事件;當添加新監聽器時,newListener事件會觸發;當監聽器被移除時,removeListener事件被觸發。該對象用法如下:
// 2.4.event.js文件
var EventEmitter = require('events').EventEmitter;
var event = new EventEmitter();
event.on('some_event', function() {
console.log('some_event 事件觸發');
});
setTimeout(function() {
event.emit('some_event');
}, 1000);
-
運行代碼,1s后控制臺輸出'some_event 事件觸發'。原理是event對象注冊了事件some_event的一個監聽器,然后我們通過serTimeout在1000毫秒后向event對象發送事件some_event,此時調用some_event的監聽器。
觸發some_event綁定的事件 EventEmitter的每個事件由一個事件名和若干參數組成,事件名是一個字符串,通常表達一定的語義;對于每個事件,Event Emitter支持若干個事件監聽器。
當事件觸發時,注冊到這個事件的監聽器被依次調用,事件參數作為回調函數參數傳遞。
var events = require('events');
var emitter = new events.EventEmitter();
emitter.on('someEvent', function(arg1, arg2) {
console.log('listener1', arg1, arg2);
});
emitter.on('someEvent', function(arg1, arg2) {
console.log('listener2', arg1, arg2);
});
emitter.emit('someEvent', 'arg1參數', 'arg2參數');
以上代碼運行結果
方法
NO. | 方法&描述(詳情見參考鏈接) |
---|---|
1 | addListener(event, listener) 為指定事件添加一個監聽器到監聽器數組的尾部。 |
2 | on(event, listener) 為指定事件注冊一個監聽器,接受一個字符串event和一個回調函數。 |
3 | once(event, listener) 為指定事件注冊一個單次監聽器,即監聽器最多只會觸發一次,觸發后立刻解除該監聽器。 |
4 | removeListener(event, listener) 移除指定事件的某個監聽器,監聽器必須是該事件已經注冊過的監聽器。 它接受兩個參數,第一個是事件名稱,第二個是回調函數名稱。 |
5 | removeAllListener([event]) 移除所有事件的所有監聽器,如果指定事件,則移除指定事件的所有監聽器。 |
6 | setMaxListener(n) 默認情況下, EventEmitters 如果你添加的監聽器超過 10 個就會輸出警告信息。 setMaxListeners 函數用于提高監聽器的默認限制的數量。 |
7 | listeners(event) 返回指定事件的監聽器數組。 |
8 | emit(event, [arg1], [arg2], [...]) 按參數的順序執行每個監聽器,如果事件有注冊監聽返回 true,否則返回 false。 |
類方法
NO. | 方法&描述(詳情見參考鏈接) |
---|---|
1 | listenerCount(emitter, event) 返回指定事件的監聽器數量。 |
其余參見參考內容鏈接