【问题标题】: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) }
}
在这种情况下,data1、data2、data3 是不相关的,但必须在这样的 1 个函数内完成。这意味着如果其中一个请求失败,应用程序将部分出错,但仍可以显示其他数据。现在如果data1 或data2 失败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) }
};
但是,如果其中一个承诺失败,那仍然会失败。摆脱它的一种简单方法是创建一个包装函数,该函数将防止失败并在失败的情况下返回 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));
}