【问题标题】:gracefull fallback where one promise in async / await chain fails?异步/等待链中的一个承诺失败的优雅回退?
【发布时间】:2018-01-09 12:41:13
【问题描述】:

所以,我有一系列需要执行的 api 调用,类似这样的

const myBigCall = async (paramsObj) => {
  try {
    const data1 = await myCall1(paramsObj.first);
    const data2 = await myCall2(paramsObj.second);
    const data3 = await myCall3(paramsObj.third);
  } catch e { console.error(e) }
}

在这种情况下,data1data2data3 是不相关的,但必须在这样的 1 个函数内完成。这意味着如果其中一个请求失败,应用程序将部分出错,但仍可以显示其他数据。现在如果data1data2 失败data3 将永远不会被调用。有没有办法调用它,但仍然能够捕获错误?

【问题讨论】:

    标签: javascript asynchronous promise async-await


    【解决方案1】:

    如果调用不相关,则不应以这种方式使用 await,因为它会阻止每个调用。至少,您应该使用 Promise.all 来同时进行调用。

    const myBigCall = async (paramsObj) => {
      try {
        const dataArray = await Promise.all([
            myCall1(paramsObj.first),
            myCall2(paramsObj.second),
            myCall3(paramsObj.third)
        ]);
      } catch e { console.error(e) }
    };
    

    但是,如果其中一个承诺失败,那仍然会失败。摆脱它的一种简单方法是创建一个包装函数,该函数将防止失败并在失败的情况下返回 nullundefined 并删除整个 try 块:

    const dontFail = promise => promise.catch(() => null);
    
    const myBigCall = async (paramsObj) => {
      const dataArray = await Promise.all([
          myCall1(paramsObj.first),
          myCall2(paramsObj.second),
          myCall3(paramsObj.third)
      ].map(dontFail));
    
    }
    

    【讨论】:

      猜你喜欢
      • 2018-10-17
      • 2017-06-15
      • 1970-01-01
      • 1970-01-01
      • 2021-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多