Node.js 全部的異步 I/O 操做在完成時都會發送一個事件到事件隊列。
Node.js 裏面的許多對象都會分發事件:一個net.Server對象會在每次有新鏈接時分發一個事件, 一個fs.readStream對象會在文件被打開的時候發出一個事件。 全部這些產生事件的對象都是 events.EventEmitter 的實例。 你能夠經過require("events");來訪問該模塊。
。。。
EventEmitter介紹
events 模塊只提供了一個對象: events.EventEmitter。EventEmitter 的核心就 是事件發射與事件監聽器功能的封裝。
EventEmitter 的每一個事件由一個事件名和若干個參 數組成,事件名是一個字符串,一般表達必定的語義。對於每一個事件,EventEmitter 支持 若干個事件監聽器。 http://www.iis7.com/a/lm/zhanqun/ IIS7站羣大全
當事件發射時,註冊到這個事件的事件監聽器被依次調用,事件參數做 爲回調函數參數傳遞。
。。。
EventEmitter經常使用的API
EventEmitter.on(event, listener)、emitter.addListener(event, listener) 爲指定事件註冊一個監聽器,接收一個字符串 event 和一個回調函數 listener。
server.on('connection', function (stream) {
console.log('someone connected!');
});
EventEmitter.emit(event, [arg1], [arg2], [...]) 發射 event 事件,傳 遞若干可選參數到事件監聽器的參數表。
EventEmitter.once(event, listener) 爲指定事件註冊一個單次監聽器,即 監聽器最多隻會觸發一次,觸發後馬上解除該監聽器。
server.once('connection', function (stream) {
console.log('Ah, we have our first user!');
});
EventEmitter.removeListener(event, listener) 移除指定事件的某個監聽 器,listener 必須是該事件已經註冊過的監聽器。
var callback = function(stream) {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
EventEmitter.removeAllListeners([event]) 移除全部事件的全部監聽器, 若是指定 event,則移除指定事件的全部監聽器。
。。。
error 事件
EventEmitter 定義了一個特殊的事件 error,它包含了"錯誤"的語義,咱們在遇到 異常的時候一般會發射 error 事件。
當 error 被髮射時,EventEmitter 規定若是沒有響 應的監聽器,Node.js 會把它看成異常,退出程序並打印調用棧。
咱們通常要爲會發射 error 事件的對象設置監聽器,避免遇到錯誤後整個程序崩潰。例如:
var events = require('events');
var emitter = new events.EventEmitter();
emitter.emit('error');
。。。
繼承 EventEmitter
大多數時候咱們不會直接使用 EventEmitter,而是在對象中繼承它。包括 fs、net、 http 在內的,只要是支持事件響應的核心模塊都是 EventEmitter 的子類。
爲何要這樣作呢?緣由有兩點:
首先,具備某個實體功能的對象實現事件符合語義, 事件的監聽和發射應該是一個對象的方法。
其次JavaScript 的對象機制是基於原型的,支持 部分多重繼承,繼承 EventEmitter 不會打亂對象原有的繼承關係。數組