io.js
中的許多對象觸發(fā)事件:一個net.Server
每次被連接時觸發(fā)事件,一個fs.readStream
當文件打開時觸發(fā)事件。所有觸發(fā)事件的對象都是events.EventEmitter
的實例。你可以通過require("events");
來取得這個模塊。
通常,事件名以駝峰字符串來命令,但是這不是嚴格要求的,任何字符串都是可以接受的。
為了處理觸發(fā)的事件,我們將函數(shù)關聯(lián)到對象上。這些函數(shù)被稱為監(jiān)聽器。在監(jiān)聽器中,this
指向監(jiān)聽器所關聯(lián)的EventEmitter
實例。
使用require('events')
來獲取這個EventEmitter
類。
var EventEmitter = require('events');
當一個EventEmitter
實例發(fā)生了一個錯誤,一個典型的做法是觸發(fā)一個error
事件。error
事件在io.js
中被視為一個特殊的事件,如果沒有為其添加監(jiān)聽器,默認的行為是打印堆棧追蹤信息并推出程序。
所有的EventEmitter
實例,在被添加新的監(jiān)聽器時,都會觸發(fā)newListener
事件。當有監(jiān)聽器被移除時,都會觸發(fā)removeListener
事件。
為指定的事件,在其監(jiān)聽器數(shù)組的末尾添加一個新的監(jiān)聽器。不會去檢查這個事件是否已經(jīng)被監(jiān)聽過。事件的多次觸發(fā)會導致監(jiān)聽器的多次被調用。
server.on('connection', function (stream) {
console.log('someone connected!');
});
返回一個emitter
,所以可以被鏈式調用。
為事件添加一個 一次性 監(jiān)聽器。這個監(jiān)聽器只會在下次事件觸發(fā)時被調用,之后被移除。
server.once('connection', function (stream) {
console.log('Ah, we have our first user!');
});
返回一個emitter
,所以可以被鏈式調用。
從監(jiān)聽器數(shù)組中移除指定事件的一個監(jiān)聽器。注意:在數(shù)組中,此監(jiān)聽器被移除后,其之后的監(jiān)聽器的索引會被改變。
var callback = function(stream) {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
removeListener
一次只會從監(jiān)聽器數(shù)組中移除一個監(jiān)聽器。如果特定事件的單個的監(jiān)聽器被添加了多次,removeListener
也必須調用同樣多次來移除它們。
返回一個emitter
,所以可以被鏈式調用。
移除指定事件的所有監(jiān)聽器。使用這個方法來 移除不是在你的代碼中創(chuàng)建的emitter
(如socket
和fs
)的所有監(jiān)聽器 ,并不是一個明智的選擇。
返回一個emitter
,所以可以被鏈式調用。
默認的,當一個特定事件被添加了超過10個監(jiān)聽器時,EventEmitter
會打印一個警告。這是一個對于發(fā)現(xiàn)內存泄露非常有用的默認警告。但是顯然,并不是所有的emitter
都應當被限制。這個函數(shù)可以用來增加這個上限。如果想要無限制,請設置0
。
返回一個emitter
,所以可以被鏈式調用。
返回emitter
當前的最大監(jiān)聽器數(shù)的值,可能是emitter.setMaxListeners(n)
設置的值,或者是EventEmitter.defaultMaxListeners
。
這個值對于調節(jié)最大監(jiān)聽器數(shù)來避免 不負責任的警告 或 最大監(jiān)聽器數(shù)過大,都非常有用。
emitter.setMaxListeners(emitter.getMaxListeners() + 1);
emitter.once('event', function () {
// do stuff
emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
});
emitter.setMaxListeners(n)
在實例級別設置最大監(jiān)聽器數(shù)。這個類屬性讓你可以設置所有EventEmitter
的默認最大監(jiān)聽器數(shù),對當前已創(chuàng)建的和未來創(chuàng)建的EventEmitter
都有效。請謹慎使用它。
注意,emitter.setMaxListeners(n)
仍優(yōu)先于EventEmitter.defaultMaxListeners
。
返回指定事件的監(jiān)聽器數(shù)組。
server.on('connection', function (stream) {
console.log('someone connected!');
});
console.log(util.inspect(server.listeners('connection'))); // [ [Function] ]
使用提供的參數(shù),執(zhí)行每一個監(jiān)聽器。
如果事件有監(jiān)聽器,那么返回true
,否則返回false
。
返回指定事件的監(jiān)聽器數(shù)。
這個事件在監(jiān)聽器被添加前觸發(fā)。當這個事件被觸發(fā)時,監(jiān)聽器還沒有被添加到事件的監(jiān)聽器數(shù)組中。在newListener
事件的回調函數(shù)中拿到事件名時,監(jiān)聽器還沒有開始被添加到該事件。
這個事件在監(jiān)聽器被移除后觸發(fā)。當這個事件被觸發(fā)時,監(jiān)聽器已經(jīng)從事件的監(jiān)聽器數(shù)組中被移除了。
更多建議: