当前位置: 首页 > 知识库问答 >
问题:

重试失败的异步/promise函数?

傅花蜂
2023-03-14

我有一个异步块:

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

我可以跟踪成功和失败的结果。但是,是否可以重试整个test()。然后()。如果我们失败了,catch()chain?然后继续重试,直到问题解决?

共有3个答案

鄢子平
2023-03-14

如果输入了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');
  });

如果您的doThings可以接受结果参数,并且如果tryTest不接受任何参数,您可以将上述内容简化为:

function tryTest() {
  return test()
    .then(doSomething)
    .catch(tryTest);
}


tryTest()
  .then(() => {
    console.log('Finished successfully');
  });
秦宏硕
2023-03-14

假设这一切都是关于将请求重新发送到某个有缺陷/臃肿的第三方API

如果这是生产问题,而不是教育问题,我建议搜索第三方库,自行实现。

比如说对于axios,有一个很好的axios重试。

为什么?假设您可能认为只有一种情况下API say返回502。但实际上还有更多情况,最好记住:

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

如果你自己写这样一个逻辑,那就太过分了。尝试使用最简单的解决方案可能会在你们意想不到的时候打击你们。

PS也是一个额外的好处,您可以使用单个片段将所有请求配置为某些特定的API,就像axios'自定义实例一样(我相信应该有其他插件用于替代库)

臧翰采
2023-03-14

如果可以切换到异步/等待语法,则可以使用while循环:

let keepTrying;

do {
    try {
        await test();
        keepTrying = false;
    } catch {
        keepTrying = true;
    }
} while (keepTrying)

doSomething();

然后,您可以将重试逻辑抽象为它自己的函数以供重用。

 类似资料:
  • 我有一个异步函数,我想同时测试成功和失败。函数成功时返回一个字符串,失败时抛出。我在测试失败上失败得很惨。下面是我的代码: 我通过注释失败的代码并在注释中添加结果来禁用 正如你所看到的,什么都不起作用。我相信我的测试几乎是第一个失败测试的Promises示例和最后一个失败测试的Async/Await示例的完全副本,但是没有一个可以工作。 我相信与Jest文档中的示例的不同之处在于,它们展示了如何测

  • 我正在使用编写promise代码。然后现在,我决定使用wait/async编写它。我在promise中调用了一个函数add_,然后在中调用了另一个函数。然后是该函数的一部分。这是我使用的代码。然后 这是使用wait/async的代码。 使用await/async的代码显示了一个错误,即add\u lessons是意外标识符。那么,告诉我如何在promise中定义异步函数?

  • 转换为任务返回委托的异步lambda表达式不能返回值

  • 我试图了解异步/等待如何与promise一起工作。 据我所知,await应该是阻塞的,在上面的代码中,它似乎阻塞了返回带有原语

  • 我创建了新的Deploy-to-staging项目,并将其配置编辑如下: > 在构建中,选择从另一个项目复制工件选择项目工件 选择生成后操作 我怎么才能修好这个? 我的tomcat凭据位于[tomcat目录]/conf/tomcat-users.xml中,如下所示: