【NOTE】【深入浅出nodejs】异步编程(二)

异步编程解决方法

异步编程的主要解决方法:

1. 事件发布 / 订阅模式

2. Promise / Deferred 模式

3. 流程控制库

1. 事件发布 / 订阅模式

事件监听模式是一种广泛用于异步编程的模式,是回调函数的事件化

 Node自身提供的events模块(Events | Node.js v19.0.0 Documentation)是发布 / 订阅模式的一个简单实现,Node中部分模块都继承自它,这个模块比前端浏览器中的大量DOM事件简单,不存在事件冒泡,也不存在preventDefault()、stopPropagation()和stopImmediatePropagation()等控制事件传递的方法。

event.preventDefault - Web API 接口参考 | MDN
event.stopImmediatePropagation - Web API 接口参考 | MDN
event.stopPropagation - Web API 接口参考 | MDN

它具有 addListener / on() 、once()、removeListener() 、removeAllListeners() 和 emit()等基本的事件监听模式的方法实现。

 

 Node对事件发布/订阅的机制做了一些额外的处理,这大多数基于健壮性而考虑的。

1. 如果对一个事件添加了超过10个监听器,将会得到一条警告。这一处设计与Node自身单线程运行有关,设计者认为侦听器太多可能导致内存泄漏,所以存在这样一条警告。调用emitter.setMaxListeners(0):可以将这个限制去掉。另一方面,由于事件发布会引起一系列侦听器执行,如果事件相关的侦听器过多,可能存在过多占用CPU的情景。
 

2. 为了处理异常,EventEmitter对象对error事件进行了特殊对待。如果运行期间的错误触发了error事件,EventEmitter会检查是否有对error事件添加过侦听器。如果添加了,这个错误将会交由该侦听器处理,否则这个错误将会作为异常抛出。如果外部没有捕获这个异常,将会一起线程退出。一个健壮得EventEmitter实例应该对error事件做处理。

 1. 继承events模板

 

 2. 利用事件队列解决雪崩问题

在事件订阅/发布模式中,通常也有一个once() 方法,通过它添加的侦听器只能执行一次,在执行之后就会将它与事件的关联移除。这个特性常常可以帮助我们过滤一些重复性的事件响应。

emitter.once(eventName, listener)

添加:v0.3.0

  • eventName {String} | {Symbol} 事件名

  • listener {Function} 回调函数

给名为 eventName 的事件添加一个一次性的 listener 函数。下一次发出 eventName 事件时,此监听器将被移除,并在随后调用。

server.once('connection', (stream) => {
    console.log('哈,我们有第一个用户!');
});

返回一个当前 EventEmitter 的引用以便链式调用。

默认情况下,事件监听器按照添加的顺序依次调用。emitter.prependOnceListener() 方法可以用作将事件监听器添加到 listeners 数组开头的可选方法。

const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// 打印:
//   b
//   a

 

3. 多异步之间的协作方案(不好理解,直接抄吧)

 

 4. EventProxy的原理

 5. EventProxy的异常处理

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值