1.EventEmitter
Node中很多模塊都能夠使用EventEmitter,有了EventEmitter才能方便的進行事件的監聽。下面看一下Node.js中的EventEmitter如何使用。
(1)基本使用
EventEmitter是對事件觸發和事件監聽功能的封裝,在node.js中的event模塊中,event模塊只有一個對象就是EventEmitter,下面是一個最基本的使用方法:
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);
上面的代碼中首先實例化了一個EventEimitter對象,然後就可以進行事件的監聽以及發佈。通過on方法對特定的事件進行監聽,通過emit方法對事件進行發佈。在1s後發佈一個"some_event"事件,這個時候就會自動被event對象通過on進行監聽,並觸發對應的回調方法。
(2)EventEmitter支持的方法
EventEmitter實例對象支持的方法列表如下:
emitter.on(name, f) //對事件name指定監聽函數f
emitter.once(name, f) //與on方法類似,但是監聽函數f是一次性的,使用後自動移除
emitter.listeners(name) //返回一個數組,成員是事件name所有監聽函數
emitter.removeListener(name, f) //移除事件name的監聽函數f
emitter.removeAllListeners(name) //移除事件name的所有監聽函數
同時,事件的發佈emit方法可以傳入多個參數,第一個參數是定義的事件,後面其他參數回作爲參數傳遞到監聽器的回調函數中。示例如下:
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 參數');
2.原生JavaScript實現事件的訂閱/發佈模式
上面的EventEmitter就是事件訂閱/發佈模式的實現,下面我們使用原生的JavaScript進行實現:
var EventEmitter = {
topics: {},
on: function(topic, listener){ //訂閱事件
if (!this.topics[topic]) {
this.topics[topic] = [];
}
//將監聽函數push到對應的數組位置,即topic事件對應listener方法
this.topics[topic].push(listener);
},
emit: function(topic, data){ //第一個參數是事件名,第二個參數是傳入監聽器回調方法內的參數
if (!this.topics[topic] || this.topics[topic].length < 1) {
return;
}
//對topic事件的每個監聽函數,執行listener方法
this.topics[topic].forEach(function(listener){
listener(data || {});
});
}
};
我們可以使用上面自己定義的EventEmitter類了,比如:EventEmitter.on("myevent", function(a){
console.log(a); //控制檯打印出Hi
});
EventEmitter.emit("myevent", "Hi"); //發佈事件後,控制檯打印出Hi