【问题标题】:Wrapping promise in async/await在异步/等待中包装承诺
【发布时间】:2016-12-14 19:32:51
【问题描述】:

我在使用 async/await 并从 Promise 返回一个值时遇到了一些困难。

function test () {
  return new Promise((resolve, reject) => {
    resolve('Hello')
  })
} 

async function c() {
  await test()
}

据我了解,我应该能够通过以下方式获得价值:

console.log(c())

但显然我在这里遗漏了一点,因为这会返回一个承诺。它不应该打印“你好”吗?在类似的注释中,我不清楚在将回调包装到 async/await 之前是否需要将其转换为 Promise?

【问题讨论】:

  • 嗯,不,async/await 不会神奇地使异步代码同步运行。异步函数之外的代码仍然需要等待异步函数完成。

标签: node.js promise async-await ecmascript-next


【解决方案1】:

我在这里遗漏了一点,因为这会返回一个承诺。 console.log(c())不应该打印“hello”吗?

不,async 函数总是返回承诺。它们并没有神奇地同步运行异步代码 - 相反,它们将看起来同步的代码(尽管带有 await 关键字)变成了异步运行的代码。

你可以在异步函数内部获取结果值:

async function c() {
  const result = await test()
  console.log(result);
  return 'World';
}
c().then(console.log);

我不清楚在将回调包装到 async/await 之前是否需要将其转换为 Promise?

是的,你可以await 只承诺。请参阅How do I convert an existing callback API to promises? 了解如何进行转换。

【讨论】:

    【解决方案2】:

    异步函数返回一个 Promise。如果函数抛出错误,则 承诺将被拒绝。如果函数返回一个值,Promise 会解决的。

    【讨论】:

      猜你喜欢
      • 2018-07-17
      • 2017-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-03
      • 2018-03-05
      相关资源
      最近更新 更多