Node自身提供的events模块是发布/订阅模式,Node中大部分模块都继承自它,不存在冒泡,具有addListener/on() once() removeListener() removeAllListeners() emit()等方法。
//订阅
emitter.on('event1',function(message){
console.log(message);
})
//发布
emitter.emit('event1','I am message');
事件发布/订阅模式自身并无同步异步的问题,但在Node中,emit()调用多半是伴随事件循环而异步触发的,因此将其应用与异步编程。
1继承eveents模块
用Util模块,因为它封装了继承的方法
var events = require('events');
function Stream(){
events.EventEmitter.call(this);
}
util.inherits(Stream,events.EventEmitter);
2利用事.件队列解决雪崩问题
var proxy = new events.EventEmitter();
var status = "ready";
var select = function(callback){
proxy.once("selected",callback);
if(status === "ready"){
status = "pending";
db.select('SQL',function(results){
proxy.emit('selected',results);
status = 'ready';
})
}
}
这里用once()方法,将所有请求的回调都压入事件队列中,利用其执行一次就会将监视器移除的特点,保证每一个回调只会被执行一次。对于相同的SQL语句,保证在同一个查询开始到结束的过程中永远只有一次。SQL在进行查询时,新到来的相同调用只需在队列中等待数据就绪即可,一旦查询结束,得到的结果可以被这些调用共同使用。这种方式能节省重复的数据库调用产生的开销。
3多异步协作方案
4EventProxy的原理