我有一段非常令人困惑的使用es6 async
await
语法的代码片段。我本来期望的情况是,进程会在await
行上永远挂起,因为没有调用resolve函数。然而,实际情况是输出了“start”,然后进程退出并没有更多输出。
const simple = async () => {
console.log('start')
await new Promise(resolve => {})
console.log('done.')
}
simple()
然而,下面的代码将打印“start”,等待1秒钟,然后打印“done”。
const simple = async () => {
console.log('start')
await new Promise(resolve => setTimeout(resolve, 1000))
console.log('done.')
}
simple()
我对这个意思的最接近猜测(没有任何证据)是当节点等待承诺时,它会跟踪在您的代码中正在发生的活动事物,当没有其他事情发生时,它就会退出。有人能解释一下为什么代码在这里退出吗?
运行node v8.7.0
async
/await
函数,它与常规函数不同,后者总是运行到完成。如果您重写simple
以不使用async
/await
,则在await
语句之后执行的代码将必须放置在.then()
回调内。由于您没有调用resolve()
,因此该代码将永远不会执行,因此控制台不会打印“done”。Promise的主体立即执行,由于它为空,因此程序没有剩余可执行的内容! - Aviusasync
/await
语法,思考这个问题时为什么代码停止执行就会更加明显。 - andykais