Javascript 异步/等待链中的一个承诺失败时的优雅回退?

Javascript 异步/等待链中的一个承诺失败时的优雅回退?,javascript,asynchronous,promise,async-await,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.err

所以,我有一系列的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) }
}

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

如果调用是不相关的,您不应该使用wait,因为它会阻止每次调用。至少,您应该使用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) }
};
然而,如果其中一个承诺失败,这仍然会失败。摆脱它的一个简单方法是创建一个包装函数,该函数将防止失败,并在失败的情况下返回
null
undefined
,并删除整个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));

}