關於Node.js的events.EventEmitter

Node.js 所有的異步 I/O 操作在完成時都會發送一個事件到事件隊列。

Node.js裏面的許多對象都會分發事件:一個net.Server對象會在每次有新連接時分發一個事件, 一個fs.readStream對象會在文件被打開的時候發出一個事件。 所有這些產生事件的對象都是 events.EventEmitter 的實例。
EventEmitter 類

events 模塊只提供了一個對象: events.EventEmitter。EventEmitter 的核心就是事件觸發與事件監聽器功能的封裝。

你可以通過require(“events”);來訪問該模塊。
Js代碼 收藏代碼

// 引入 events 模塊  
var events = require('events');  
// 創建 eventEmitter 對象  
var eventEmitter = new events.EventEmitter();  

EventEmitter 對象如果在實例化時發生錯誤,會觸發 ‘error’ 事件。當添加新的監聽器時,’newListener’ 事件會觸發,當監聽器被移除時,’removeListener’ 事件被觸發。

下面我們用一個簡單的例子說明 EventEmitter 的用法:
Js代碼 收藏代碼

//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);   

執行結果如下:

運行這段代碼,1 秒後控制檯輸出了 ‘some_event 事件觸發’。其原理是 event 對象註冊了事件 some_event 的一個監聽器,然後我們通過 setTimeout 在 1000 毫秒以後向 event 對象發送事件 some_event,此時會調用some_event 的監聽器。
Js代碼 收藏代碼

$ node event.js   
some_event 事件觸發  

EventEmitter 的每個事件由一個事件名和若干個參數組成,事件名是一個字符串,通常表達一定的語義。對於每個事件,EventEmitter 支持 若干個事件監聽器。

當事件觸發時,註冊到這個事件的事件監聽器被依次調用,事件參數作爲回調函數參數傳遞。

讓我們以下面的例子解釋這個過程:
Js代碼 收藏代碼

//event.js 文件  
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 參數');   

執行以上代碼,運行的結果如下:
Js代碼 收藏代碼

$ node event.js   
listener1 arg1 參數 arg2 參數  
listener2 arg1 參數 arg2 參數  

以上例子中,emitter 爲事件 someEvent 註冊了兩個事件監聽器,然後觸發了 someEvent 事件。

運行結果中可以看到兩個事件監聽器回調函數被先後調用。 這就是EventEmitter最簡單的用法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章