异步编程——事件发布/订阅

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的原理


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值