Node.js nodejs-跳过未经解析的等待承诺后的语句

Node.js nodejs-跳过未经解析的等待承诺后的语句,node.js,asynchronous,promise,Node.js,Asynchronous,Promise,将跳过运行以下代码段,console.log('done'): function test (cb) { setTimeout(() => { console.log('2000ms passed') cb && cb() }, 2000) } async function run () { await new Promise((resolve, reject) => { // Doesn't run console.log('d

将跳过运行以下代码段,
console.log('done')

function test (cb) {
  setTimeout(() => {
    console.log('2000ms passed')
    cb && cb()
  }, 2000)
}

async function run () {
  await new Promise((resolve, reject) => {
    // Doesn't run console.log('done') with test():
    // But if test(resolve), console.log('done.') will run
    test() 
  })
  console.log('done.')
}

run()

为什么没有解析的
test()
不运行
console.log('done')

承诺只有在调用
resolve
回调时才会解析。如果承诺未得到解决或拒绝,它将永远处于
挂起
状态

Await
关键字实际上用于“等待承诺解决”,在您的示例中从未出现过

您的函数
test
期望在超时时间过后执行某些函数。当您将
resolve
作为
test
函数的参数传递时,它将在超时后被调用,promise将被解析,您将看到控制台日志

我不确定您试图实现的结果是什么,但下面是一个简短的代码片段,显示了2秒
睡眠
函数的实现:

函数sleepTwoSeconds(){
返回新承诺(resolve=>setTimeout(resolve,2000))
}
异步函数run(){
console.log('start');
等待睡眠两秒钟();
console.log('2秒过去');
}

run()
因为您的承诺永远处于挂起状态<代码>等待承诺将在承诺得到解决或拒绝之前停止函数执行。没有现成的超时。由于您既不调用
resolve
也不调用
reject
,外部函数将永远不会继续执行。@YuryTarabanko,但代码段在2秒后完成,不会被卡住。为什么程序不能永远挂在那里呢?事情是悬而未决的承诺不会创建任务。所以在事件循环中没有什么可以做的了。所以节点只是退出,但代码段在2秒后完成,没有被卡住。为什么程序不能永远挂在那里?因为在这个过程中实际上没有悬而未决的回调。