Node.js 所有的異步 I/O 操作在完成時(shí)都會(huì)發(fā)送一個(gè)事件到事件隊(duì)列浅萧。
1.EventEmitter 類(lèi)
events是nodejs中的一個(gè)模塊,它可以提供一個(gè)對(duì)象 events.EventEmitter()
EventEmitter的核心功能就是事件觸發(fā)器和事件監(jiān)聽(tīng)了蚤蔓。
同樣的我們可以通過(guò) require('events') 來(lái)獲取該模塊
// 引入 events 模塊
var events = require('events');
// 創(chuàng)建 eventEmitter 對(duì)象
var eventEmitter = new events.EventEmitter();
EventEmitter 對(duì)象如果在實(shí)例化時(shí)發(fā)生錯(cuò)誤,會(huì)觸發(fā) error 事件糊余。當(dāng)添加新的監(jiān)聽(tīng)器時(shí)秀又,newListener 事件會(huì)觸發(fā),當(dāng)監(jiān)聽(tīng)器被移除時(shí)贬芥,removeListener 事件被觸發(fā)吐辙。
2.event demo
event在一秒后執(zhí)行 some_event
event監(jiān)聽(tīng) some_event,此時(shí)進(jìn)行回調(diào)蘸劈,打印結(jié)果昏苏。
var EventEmitter = require('events').EventEmitter;
var event = new EventEmitter();
event.on('some_event', function() {
console.log('some_event 事件觸發(fā)');
});
setTimeout(function() {
event.emit('some_event');
}, 1000);
EventEmitter 的每個(gè)事件由一個(gè)事件名和若干個(gè)參數(shù)組成,事件名是一個(gè)字符串威沫,通常表達(dá)一定的語(yǔ)義贤惯。對(duì)于每個(gè)事件,EventEmitter 支持 若干個(gè)事件監(jiān)聽(tīng)器棒掠。
當(dāng)事件觸發(fā)時(shí)孵构,注冊(cè)到這個(gè)事件的事件監(jiān)聽(tīng)器被依次調(diào)用,事件參數(shù)作為回調(diào)函數(shù)參數(shù)傳遞句柠。
3.EventEmitter各種方法介紹
①addListener(event, listener)
為指定的事件添加監(jiān)聽(tīng)器
②on(event, listener)
為指定事件注冊(cè)一個(gè)監(jiān)聽(tīng)器浦译,接受一個(gè)字符串 event 和一個(gè)回調(diào)函數(shù)。
server.on('connection', function (stream) {
console.log('someone connected!');
});
③once(event, listener)
為指定事件注冊(cè)一個(gè)單次監(jiān)聽(tīng)器溯职,即 監(jiān)聽(tīng)器最多只會(huì)觸發(fā)一次,觸發(fā)后立刻解除該監(jiān)聽(tīng)器帽哑。
server.once('connection', function (stream) {
console.log('Ah, we have our first user!');
});
④removeListener(event, listener)
移除指定事件的某個(gè)監(jiān)聽(tīng)器谜酒,監(jiān)聽(tīng)器必須是該事件已經(jīng)注冊(cè)過(guò)的監(jiān)聽(tīng)器。
它接受兩個(gè)參數(shù)妻枕,第一個(gè)是事件名稱(chēng)僻族,第二個(gè)是回調(diào)函數(shù)名稱(chēng)粘驰。
var callback = function(stream) {
console.log('someone connected!');
};
server.on('connection', callback);
server.removeListener('connection', callback);
⑤removeAllListeners([event])
移除所有事件的所有監(jiān)聽(tīng)器, 如果指定事件述么,則移除指定事件的所有監(jiān)聽(tīng)器蝌数。
⑥setMaxListeners(n)
默認(rèn)情況下, EventEmitters 如果你添加的監(jiān)聽(tīng)器超過(guò) 10 個(gè)就會(huì)輸出警告信息度秘。 setMaxListeners 函數(shù)用于提高監(jiān)聽(tīng)器的默認(rèn)限制的數(shù)量顶伞。
⑦listeners(event)
返回指定事件的監(jiān)聽(tīng)器數(shù)組。
⑧emit(event, [arg1], [arg2], [...])
按參數(shù)的順序執(zhí)行每個(gè)監(jiān)聽(tīng)器剑梳,如果事件有注冊(cè)監(jiān)聽(tīng)返回 true唆貌,否則返回 false。
4.EventEmitter demo
var events = require('events');
var eventEmitter = new events.EventEmitter();
//監(jiān)聽(tīng)器1
var listener1 = function listener1(){
console.log('監(jiān)聽(tīng)器 listener1 執(zhí)行')
}
//監(jiān)聽(tīng)器2
var listener2 = function listener2(){
console.log('監(jiān)聽(tīng)器 listener2 執(zhí)行')
}
// 綁定 connection 事件垢乙,處理函數(shù)為 listener1
eventEmitter.addListener('connection',listener1);
// 綁定 connection 事件锨咙,處理函數(shù)為 listener2
eventEmitter.on('connection', listener2);
var eventListeners = eventEmitter.listenerCount('connection');
console.log(eventListeners+"個(gè) 監(jiān)聽(tīng)器監(jiān)聽(tīng)連接事件")
//觸發(fā) connection 事件
eventEmitter.emit('connection');
eventEmitter.removeListener('connection',listener1);
console.log('listener1 監(jiān)聽(tīng)取消')
//觸發(fā)連續(xù)事件
eventEmitter.emit('connection');
eventListeners = eventEmitter.listenerCount('connection');
console.log(eventListeners+'個(gè)監(jiān)聽(tīng)器監(jiān)聽(tīng)連接事件');
console.log('程序執(zhí)行完畢');
①首先添加2個(gè)方法 listener1 和 listener2
②然后監(jiān)聽(tīng)方法 connection,執(zhí)行的時(shí)候追逮,回調(diào)listener1
③var eventListeners = eventEmitter.listenerCount('connection');
獲取監(jiān)聽(tīng)事件個(gè)數(shù)并且在下面打印出來(lái)
④使用emit觸發(fā) connection 事件
⑤讓listener1 方法取消對(duì) connection 的監(jiān)聽(tīng)
⑥再次觸發(fā) connection
⑦重新統(tǒng)計(jì) 監(jiān)聽(tīng)個(gè)數(shù)并且打印結(jié)果