gracefull fallback,async / await链中的一个promise失败了?

时间:2017-12-01 14:55:52

标签: javascript asynchronous promise async-await

所以,我有一系列需要执行的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将永远不会被调用。有没有办法调用它,但仍能捕获错误?

1 个答案:

答案 0 :(得分:3)

如果呼叫不相关,您不应该使用等待方式,因为它会阻止每个呼叫。至少,您应该使用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));

}