【问题标题】:Change recursive .then to async/await将递归 .then 更改为 async/await
【发布时间】:2017-11-08 14:26:51
【问题描述】:

我有这样的js递归fn

const recur = () => {
  fetchSomething().then( res => {
    if(typeof res.data == 'undefined'){ recur() }
    else { console.log(res.data) }
  })
}
recur()

我可以将上面的代码应用到 Async/Await 样式吗?

【问题讨论】:

  • 您确定不想return 承诺和return recur()
  • 这段代码现在可以在我的项目中正常使用了。我只需要将其更改为 async/await @Bergi 但将来我不确定
  • 为什么你需要来改变它? then 在 ES8 中也可以正常工作。但是如果你想改进代码,我会说返回用于链接和错误处理目的的承诺比语法糖更重要
  • res.data === undefined
  • 感谢新知识的使用,而不是递归。还有res.data === undefined@torazaburo

标签: javascript promise async-await ecmascript-next


【解决方案1】:

torazaburorobertklep 都正确地建议使用一段时间来实现这一点。我将在此处添加 cmets,这样他们就不会因为得分而被错过。

恕我直言,非递归解决方案应该是首选。 Promise 和then 的本质需要伪递归解决方案,但await 的一大优点是它允许我们以类似同步的方式编写异步代码。


const recur = async () => {
    const res = await fetchSomething();

    if (!res.data)
        recur();
    else
        console.log(res.data);
}

类似的东西应该可以解决问题。

Demo

【讨论】:

  • 或者使用while循环而不是递归。
  • 是的,这也可以。某种形式的最大重试是个好主意,而且冷静期可能也不会受到伤害。
  • 恕我直言,非递归解决方案应该是首选。 Promise 和then 的本质需要伪递归解决方案,但await 的一大优点是它允许我们以类似同步的方式编写异步代码。
  • @torazaburo Yay 使用类似同步的方式而不是回调,但我不明白为什么命令式和需要突变的 while-loop 应该比普通和功能递归更受欢迎:-D
  • @Bergi 出于同样的原因,人们可能会在 await 周围编写一个 for 循环,而不是作为链接承诺的更易读的替代方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-10
  • 1970-01-01
  • 2012-11-28
  • 1970-01-01
  • 2018-02-09
  • 1970-01-01
相关资源
最近更新 更多