节点 8:将 promise/callback 结构转换为 async/await [重复]
Posted
技术标签:
【中文标题】节点 8:将 promise/callback 结构转换为 async/await [重复]【英文标题】:node 8: converting a promise/callback structure to async/await [duplicate] 【发布时间】:2018-07-20 12:02:27 【问题描述】:我有以下代码块:
new Promise((res, rej) =>
if (checkCondition())
res(getValue())
else
getValueAsync((result) =>
res(result)
)
).then((value) =>
doStuff(value)
)
我想将其转换为使用async
/await
,但我不知道该怎么做。我知道当您专门使用 Promise 时,您会将对 then()
的调用替换为 value = await ...
,但是如何使用回调来实现这一点?有可能吗?
【问题讨论】:
async/await is not magic 似乎是这里要注意的重要事项 @Liam 所以听起来我想要的答案是不可能的,我现在还坚持承诺? 【参考方案1】:首先,您必须确保您在开始时处于async
函数中。那么它可能是这样的:
async function example()
let value = (checkCondition() ? getValue() : await getValueAsync());
doStuff(value);
await example();
但是,这假设您也可以修改 getValueAsync
,使其成为 async
函数或使其返回 Promise
。假设getValueAsync
必须接受回调,我们能做的不多:
async function example()
let value = (checkCondition()
? getValue()
: await new Promise(res => getValueAsync(res))
);
doStuff(value);
await example();
您仍然可以获得不必自己创建完整的Promise
链的好处。但是,getValueAsync
需要包裹在 Promise
中才能与 await
一起使用。你应该仔细考虑这种改变对你来说是否值得。例如。如果您控制了大部分代码库和/或您正在调用的大部分函数已经是async
/返回Promise
s。
【讨论】:
可以吗?getValueAsync
不返回承诺。它调用回调。
@ewok 请查看编辑后的答案。以上是关于节点 8:将 promise/callback 结构转换为 async/await [重复]的主要内容,如果未能解决你的问题,请参考以下文章