javascript - 异步/等待链中的一个 promise 失败的优雅回退?

标签 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。有没有办法调用它,但仍然能够捕获错误?

最佳答案

如果调用不相关,则不应以这种方式使用 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) }
};

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

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));

}

关于javascript - 异步/等待链中的一个 promise 失败的优雅回退?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47596020/

相关文章:

javascript - 如何在 Electron 点击按钮中打开第二个窗口

javascript - 如何确保我不会将内容替换为旧响应?

javascript - 仅当 Promise 解析时才使用 JS Array.push

javascript - 如何使用查询清除下拉列表和输入字段

javascript - 在 AngularJS 中将一个 Controller 注入(inject)另一个 Controller 时出错

c# - C#中如何计算异步方法的执行时间

java - 为方法调用的异步执行创建自定义 "Asynch"注释是个好主意吗?

promise - 使用 sequelize 的 promise 循环

javascript - 替换字符串,使其不与子元素冲突

javascript - 一个我看不懂的nodejs回调执行顺序问题的例子