node.js-跳过没有解析的Promise之后的语句

时间:2019-10-16 09:29:14

标签: 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('done') with test():
    // But if test(resolve), console.log('done.') will run
    test() 
  })
  console.log('done.')
}

run()

为什么没有test()的{​​{1}}无法运行resolve

1 个答案:

答案 0 :(得分:2)

仅当您调用resolve回调时,承诺才会解决。如果承诺没有解决或被拒绝,则承诺将永远处于pending状态。

Await关键字实际上用于“等到诺言解决”,并且在您的示例中永远不会发生。

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

我不确定您要实现的结果是什么,但这是一个简短的代码段,显示了2秒sleep函数的实现:

function sleepTwoSeconds() {
  return new Promise(resolve => setTimeout(resolve, 2000))
}

async function run() {
  console.log('start');
  await sleepTwoSeconds();
  console.log('2 seconds passed');
}

run()