【发布时间】:2018-04-08 13:52:27
【问题描述】:
我有这个使用 es6 async await 语法的非常令人困惑的 sn-p 代码。我期望发生的是该进程永远挂在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
【问题讨论】:
-
我发现还有一件事值得一提,以便更容易理解这里发生的事情。由于它是一个
async/await函数,因此它不同于常规函数,后者总是运行到完成。如果您重写simple以不使用async/await,则必须将await语句之后的代码放在.then()回调中。由于您不调用resolve(),因此该代码将永远不会执行,因此控制台不会打印“完成”。然而,Promise 的主体是立即执行的,因为它是空的,所以程序没有任何东西可以执行! -
好点子!在没有
async/await语法的情况下考虑这一点,代码停止执行的原因就更明显了 -
一个很好的解释可以在这里找到:stackoverflow.com/a/36735167/890357
标签: javascript node.js promise