节点 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/返回Promises。

【讨论】:

可以吗? getValueAsync 不返回承诺。它调用回调。 @ewok 请查看编辑后的答案。

以上是关于节点 8:将 promise/callback 结构转换为 async/await [重复]的主要内容,如果未能解决你的问题,请参考以下文章

完全二叉树节点的计算(2021-8-3)

YAML语法字符

2018.10.29-dtoj-4001-分身术(phantom)

二叉树-节点分析

LeetCode-2049 统计最高分的结点数

软考题目之头结点头指针和首元节点