栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

节点无错误退出并且不等待诺言(事件回调)

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

节点无错误退出并且不等待诺言(事件回调)

这个问题基本上是:节点如何决定退出事件循环还是再次发生?

基本上,节点保留已调度的异步请求(例如

setTimeouts
网络请求等)的参考计数。每调度一次,该计数就会增加,而每完成一次,该计数就会减少。如果到达事件循环周期的末尾,并且引用计数为零,则退出节点。

简单地创建一个Promise或事件发射器并 不会 增加引用计数-
创建这些对象实际上并不是异步操作。例如,此promise的状态将始终处于待处理状态,但过程将立即退出:

const p = new Promise( resolve => {    if(false) resolve()})p.then(console.log)

同样,在创建发射器并注册侦听器之后,这也会退出:

const ev = new EventEmitter()ev.on("event", (e) => console.log("event:", e))

如果您希望Node等待从未计划的事件,那么您可能会想到Node不知道将来是否可能发生事件,但是这样做是因为每次计划一个事件时都会计数。

因此,请考虑以下小改动:

const ev = new EventEmitter()ev.on("event", (e) => console.log("event:", e))const timer = setTimeout(() => ev.emit("event", "fired!"), 1000)// ref count is not zero, event loop will go again. // after timer fires ref count goes back to zero and node exits

作为附带说明,您可以使用以下命令删除对计时器的引用

timeout.unref()
。与前面的示例不同,这将立即退出:

const ev = new EventEmitter()ev.on("event", (e) => console.log("event:", e))const timer = setTimeout(() => ev.emit("event", "fired!"), 1000)timer.unref()
伯特·贝尔德(Bert
Belder)在这里对事件循环进行了很好的讨论,这消除了许多误解:https
//www.youtube.com/watch?v=
PNa9OMajw9w


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/401506.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号