node.js - nodejs - 跳过等待 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('done') with test():
    // But if test(resolve), console.log('done.') will run
    test() 
  })
  console.log('done.')
}

run()

为什么没有 resolvetest() 无法运行 console.log('done.')

最佳答案

仅当您调用 resolve 回调时,Promise 才会被解决。如果 Promise 未解决或被拒绝,它将永远处于 pending 状态。

Await 关键字实际上用于“等到 Promise 解析”,而它在您的示例中永远不会发生。

您的函数 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()

关于node.js - nodejs - 跳过等待 Promise 后没有解析的语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58410079/

相关文章:

node.js - 循环遍历集合中的文档以获取字段

node.js - 当链接文件不公开时替代 sendFile

c# - 如何实现 Channels 的 BlockingCollection.TakeFromAny 等效项?

scala - future 的阻塞仍然阻塞吗?

javascript - Axios 循环 promise

javascript - 如何使用 javascript promises 执行相同的函数?

php - 如何使用 TripleDES 加密与 Node.js 和 PHP-mcrypt 获得相同的结果?

node.js - Orient js 我们应该使用哪种方法来创建新顶点以及为什么

c# - 在 F# 中正确等待返回类型为 Task<T> 的异步 C# 方法

javascript - chained 然后调用错误回调执行多次