在异步/等待中包装承诺
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