【问题标题】:How to control flow of async functions?如何控制异步函数的流程?
【发布时间】:2022-01-03 15:29:56
【问题描述】:

我有一个异步函数链,需要按顺序执行。但是,如果其中一个功能失败或耗时过长,则应重新触发一定次数。

所以我的问题是: 具有异步功能的控制流的标准/优雅结构是什么?例如:

funcA()
    .then(resultA => funcB(resultA)
        .then(resultB => funcC(resultB)
            .then(...))

【问题讨论】:

    标签: javascript asynchronous async.js control-flow


    【解决方案1】:

    您可以使用 async-await 将它们整齐地链接在一起:

    const res_a = await funcA()
    const res_b = await funcB(res_a)
    const res_c = await funcC(res_b)
    

    这比链接.then 更好,因为在这里它更容易调试,因为您保存了更多值。

    旁注:如果你这样做,最好在你的函数中实现 trycatch。

    IMO 它看起来也更整洁。

    【讨论】:

    • 它看起来确实更干净。据我了解:如果调用的异步函数本身包含等待,那么这样的“等待”是否有效?我可以为这些函数调用设置超时吗?
    • 你不能等待第一个表达式,这将是一个承诺:const res_a = funcA() 然后执行:const res_b = await funcB(await res_a)
    • 你可以在这里阅读更多信息:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
    【解决方案2】:

    你可以这样做

    function funcA() {
        return Promise.resolve('a');
    }
    
    function funcB(data) {
        return Promise.resolve(data + ' b');
    }
    
    function funcC(data) {
        return Promise.resolve(data + ' c');
    }
    
    async function controlFlowExample() {
      const resultA = await funcA();
      const resultB = await funcB(resultA);
      const resultC = await funcC(resultB);
      
      console.log(resultC);
    }
    
    controlFlowExample();
    

    【讨论】:

    • 好的,我明白了。所以对我来说实现就是把它全部放在一个异步函数中,然后处理控制流。
    猜你喜欢
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    • 2019-09-14
    相关资源
    最近更新 更多