【问题标题】:Chain async functions链式异步函数
【发布时间】:2016-12-03 08:10:53
【问题描述】:

在异步函数中,我可以像这样得到一个异步值:

const foo = await myAsyncFunction()

如果我想在结果上调用一个方法,使用同步函数,我会做类似myAsyncFunction().somethingElse()

是否可以使用异步函数链接调用,还是必须为每个结果分配一个新变量?

【问题讨论】:

  • 不了解 ES7,但在其他语言中,您在 await 表达式周围使用括号来链接函数。
  • await myAsyncFunction().then(x => x.somethingElse()) :-)
  • async/await 不是 ES7 的一部分。

标签: javascript async-await ecmascript-2017


【解决方案1】:

您可以在表达式中等待,无需将其分配给新变量。 (尽管将其分配给变量可能更具可读性。)

const foo = await (await myAsyncFunction()).somethingElseAsync()

或者如果你想对结果调用同步方法:

const foo = (await myAsyncFunction()).somethingElseSync()

【讨论】:

  • 如果第一种方法是sync,第二种方法是async
  • nvm,问题是我的第二个函数没有返回任何东西 ;)
【解决方案2】:

我很惊讶它没有被提及,但在没有额外变量的情况下实现这一点的最易读的方法可能是使用.then 链,最后使用await

await myAsyncFunction()
  .then(res => res.somethingElse())

请记住,await承诺一起工作,但不能替换它们!

【讨论】:

    【解决方案3】:

    你可以试试这个包。

    // Instead of thens
    fetch(url)
      .then(res => res.json())
      .then(json => json.foo.bar)
      .then(value => console.log(value))
    
    // Instead of awaits
    const res = await fetch(url)
    const json = await res.json()
    const value = json.foo.bar
    console.log(value)
    
    // With prochain
    const value = await wrap(fetch(url)).json().foo.bar
    console.log(value)
    

    【讨论】:

      【解决方案4】:

      This answer 由 Tamas Hegedus 在 await 表达式周围加上括号,这绝对是原生 JavaScript 的最佳选择。

      或者,如果您正在寻找常用的链式 JS 方法并且不介意第三方模块,您可以在 npm 上使用 async-af。有了它,您可以像这样链接异步方法:

      const promises = [1, 2, 3].map(n => Promise.resolve(n));
      
      AsyncAF(promises).map(n => n * 2).filter(n => n !== 4).forEach(n => console.log(n));
      // logs 2 then 6
      <script src="https://unpkg.com/async-af@7.0.11/index.js"></script>

      【讨论】:

        猜你喜欢
        • 2017-02-26
        • 2019-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-17
        • 1970-01-01
        • 2019-06-27
        • 2017-07-04
        相关资源
        最近更新 更多