在异步/等待中包装承诺

Posted

技术标签:

【中文标题】在异步/等待中包装承诺【英文标题】: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 不会神奇地使异步代码同步运行。异步函数之外的代码仍然需要等待异步函数完成。 【参考方案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 会解决的。

【讨论】:

以上是关于在异步/等待中包装承诺的主要内容,如果未能解决你的问题,请参考以下文章

在自定义承诺上使用异步等待

在自定义承诺上使用异步等待

异步等待所有承诺

异步等待承诺上的 UnhandledPromiseRejectionWarning

Javascript - 异步等待和获取 - 返回值,而不是承诺?

需要帮助在 NodeJS 中使用 Sinon 存根异步 / 等待承诺