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最簡單的用法。