微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript-gracefull后备,异步/等待链中的一个承诺失败了吗?

所以,我需要执行一系列的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是无关的,但必须在这样的1个函数内完成.这意味着,如果这些请求之一失败,则应用程序将部分出错,但仍可以显示其他数据.现在,如果data1或data2失败,则永远不会调用data3.有没有一种方法可以调用它,但仍然能够捕获错误

解决方法:

如果呼叫不相关,则不应使用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) }
};

但是,如果其中一项承诺失败,那仍然会失败.摆脱它的一种简单方法是创建一个包装函数,该函数将防止失败并在失败的情况下返回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));

}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐