重试失败的异步/承诺功能吗?

时间:2018-12-30 22:45:06

标签: javascript node.js asynchronous promise

我有这个异步块:

test().then(function(result){
    // Success: Do something.
    doSomething();
}).catch(function(error){
    // Error: Handle the error, retry!
    // How to re-run this whole block?
});

我可以跟踪successfailed的结果。但是,如果失败,是否可以重试整个test().then().catch()链?并继续重试直到问题解决?

4 个答案:

答案 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的情况只有一种。但是实际上,要记住的情况要多得多:

  1. 不同的错误原因,例如,一旦出现网络或DNS查找错误,就可能无需重复请求
  2. 重试次数限制
  3. 增加延迟
  4. 其他

仅凭自己写出这样的逻辑实在是太过分了。而且,尝试使用最简单的解决方案可能会在您不期望的时候给您带来麻烦。

PS还可以作为奖励,您可以使用单个代码段配置对某个特定API的所有请求,就像用于axios的自定义实例一样(我相信应该有其他插件来替代库)