Node.js 為單線程操作,所有的異步 I/O 操作在完成時(shí)都會(huì)發(fā)送一個(gè)事件到任務(wù)隊(duì)列呐赡。
node的 events 模塊中提供了 event.EventEmitter 對(duì)象退客,EventEmitter 的核心就是事件觸發(fā)與事件監(jiān)聽器功能的封裝。
EcentEmitter 對(duì)象的方法:
? ??????addListener(event, listener) :?為指定事件添加一個(gè)監(jiān)聽器到監(jiān)聽器數(shù)組的尾部链嘀。
? ??????on(event, listener) :?為指定事件注冊(cè)一個(gè)監(jiān)聽器萌狂,接受一個(gè)字符串 event 和一個(gè)回調(diào)函數(shù)。
? ??????emit(event, [arg1], [arg2], [...]) :?按參數(shù)的順序執(zhí)行每個(gè)監(jiān)聽器怀泊,如果事件有注冊(cè)監(jiān)聽返回 true茫藏,否則返false。
基本使用:
var EventEmitter = require('events').EventEmitter;
var event = new EventEmitter();
event.on('mouse_out', function(){
????? ? console.log('event 事件觸發(fā)包个!');
});
setTimeout(function(){
? ? event.emit('mouse_out');
}, 1000);
執(zhí)行: node event.js
結(jié)果:event 事件觸發(fā)刷允!
大多數(shù)時(shí)候我們不會(huì)直接使用 EventEmitter,而是在對(duì)象中繼承它碧囊。包括 fs树灶、net、 http 在內(nèi)的糯而,只要是支持事件響應(yīng)的核心模塊都是 EventEmitter 的子類天通。為什么要這樣做呢?原因有兩點(diǎn):
首先熄驼,具有某個(gè)實(shí)體功能的對(duì)象實(shí)現(xiàn)事件符合語義像寒, 事件的監(jiān)聽和發(fā)生應(yīng)該是一個(gè)對(duì)象的方法。
其次 JavaScript 的對(duì)象機(jī)制是基于原型的瓜贾,支持 部分多重繼承诺祸,繼承 EventEmitter 不會(huì)打亂對(duì)象原有的繼承關(guān)系。?
//定義監(jiān)聽事件
var listener = function(arg){
????????console.log("listener:" + arg);
}
// 引入 events 模塊
var EventEmitter = require('events').EventEmitter;
//原型鏈實(shí)現(xiàn)繼承
function client(){}
client.prototype.a=function(){
? ? ? ? console.log('aaaaaa');
}
client.prototype.__proto__ = EventEmitter.prototype;
var client = new client();
client.a();
client.on('listener',listener);
client.emit('listener', "hello world");
//結(jié)果:
?a
listener:Hello World