我有这个异步块:
test().then(function(result){
// Success: Do something.
doSomething();
}).catch(function(error){
// Error: Handle the error, retry!
// How to re-run this whole block?
});
我可以跟踪success
和failed
的结果。但是,如果失败,是否可以重试整个test().then().catch()
链?并继续重试直到问题解决?
答案 0 :(得分:0)
如果输入catch
块,则可以将整个内容放入一个递归调用自身的函数中:
function tryTest() {
return test().then(function(result) {
// Success: Do something.
doSomething();
}).catch(function(error) {
// error handling
// make sure to return here,
// so that the initial call of tryTest can know when the whole operation was successful
return tryTest();
});
}
tryTest()
.then(() => {
console.log('Finished successfully');
});
如果您的doSomething
可以接受result
参数,并且如果tryTest
不接受任何参数,则可以将以上内容简化为:
function tryTest() {
return test()
.then(doSomething)
.catch(tryTest);
}
tryTest()
.then(() => {
console.log('Finished successfully');
});
答案 1 :(得分:0)
您可以将其放入函数中。
function dbug() {
test().then(function(result){
// Success: Do something.
doSomething();
}).catch(function(error){
// Error: Handle the error, retry!
dbug()
});
}
答案 2 :(得分:0)
如果可以切换到async/await
语法,则可以使用while
循环:
let keepTrying;
do {
try {
await test();
keepTrying = false;
} catch {
keepTrying = true;
}
} while (keepTrying)
doSomething();
然后您可以将重试逻辑抽象为它自己的函数以供重用。
答案 3 :(得分:0)
假设全部都是关于将请求重新发送到某些漏洞/膨胀的第三方API
如果是生产问题而不是有教育意义的问题,我建议搜索第3方库,该库由您自己实现。
对axios
说的不错,axios-retry
也很不错。
为什么?假设您可能认为API语句返回502的情况只有一种。但是实际上,要记住的情况要多得多:
仅凭自己写出这样的逻辑实在是太过分了。而且,尝试使用最简单的解决方案可能会在您不期望的时候给您带来麻烦。
PS还可以作为奖励,您可以使用单个代码段配置对某个特定API的所有请求,就像用于axios
的自定义实例一样(我相信应该有其他插件来替代库)