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



你可能感兴趣的:(JavaScript,函数,对象,web前端,node.js)