概述
异步编程解决方法
异步编程的主要解决方法:
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的异常处理
最后
以上就是闪闪导师为你收集整理的【NOTE】【深入浅出nodejs】异步编程(二)异步编程解决方法的全部内容,希望文章能够帮你解决【NOTE】【深入浅出nodejs】异步编程(二)异步编程解决方法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复