Node中EventEmitter以及如何實現JavaScript中的訂閱/發佈模式

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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章