gpt4 book ai didi

javascript - 当 Promise 永远不会解决时会发生什么?

转载 作者:IT老高 更新时间:2023-10-28 23:25:20 25 4
gpt4 key购买 nike

我使用 es6 async await 语法有一段非常令人困惑的代码。我期望发生的是该进程永远卡在 await 行上,因为永远不会调用 resolve 函数。然而,实际发生的是输出“start”,然后进程退出,没有更多输出。

const simple = async () => {
console.log('start')
await new Promise(resolve => {})
console.log('done.')
}
simple()

但是,下面的这段代码将打印“开始”,等待 1 秒,然后打印“完成”。

const simple = async () => {
console.log('start')
await new Promise(resolve => setTimeout(resolve, 1000))
console.log('done.')
}
simple()

我对这意味着什么的最接近的猜测(没有任何证据)是,当 node 正在等待一个 promise 时,它​​会跟踪代码中发生的事件事情,当没有其他事情发生时,它会简单地退出。有人可以解释为什么代码在这里退出吗?

运行node v8.7.0

最佳答案

My closest guess … it keeps track of the active things happening in your code, when there is nothing else happening, it simply exits.

这基本上是正确的。 Node 会保留诸如计时器和网络请求之类的引用计数。当您发出网络或其他异步请求时,设置计时器等。 Node 添加到此引用计数。当时间/请求解决 Node 从计数中减去时。

这个计数是 Node 在事件循环结束时决定是否退出的方式。当你到达事件循环的末尾时, Node 会查看这个计数,如果它为零则退出。简单地做出 promise ,不会增加引用计数,因为它不是异步请求。

[Node 核心开发人员] Bert Belder 对此进行了很好的讨论,这很有帮助:https://www.youtube.com/watch?v=PNa9OMajw9w

关于javascript - 当 Promise 永远不会解决时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46966890/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com