如何在async.race函数中使用async.retry

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在async.race函数中使用async.retry相关的知识,希望对你有一定的参考价值。

我在nodejs中使用async.race函数并行调用10个函数,现在一些调用失败了,我想给它们一个重试,因为我想使用async.retry函数。

这是我的代码片段:

async.retry({
    interval: 0,
    times: 5,
    }, this.racemethod, function callback(err, result) {
    // do something with the result
    });

public async racemethod() {
  async.race([
    async function f1(callback) {
      await agent.TEST("Q.txt");
    },
    async function f2(callback) {
      await agent.TEST("R.txt");
    },
    async function f3(callback) {
      await agent.TEST("S.txt");
    },
    async function f4(callback) {
      await agent.TEST("T.txt");
    },
    async function f5(callback) {
      await agent.TEST("U.txt");
    },
    async function f6(callback) {
      await agent.TEST("V.txt");
    },
    async function f7(callback) {
      await agent.TEST("W.txt");
    },
    async function f8(callback) {
      await agent.TEST("X.txt");
    },
    async function f9(callback) {
      await agent.TEST("Y.txt");
    },
    async function f10(callback) {
      await agent.TEST("Z.txt");
    },
],
// main callback
function callback(err, result) {
    // the result will be equal to 'two' as it finishes earlier
});

}

这是async.race函数的文档:https://caolan.github.io/async/docs.html#race

以下是async.retry函数的文档:https://caolan.github.io/async/docs.html#retry

我是新手,所以任何建议都将受到赞赏。

谢谢,

答案

警告:答案中的代码是针对javascript而不是打字稿 - 作为问题中的代码,除了publicracemethod限定符之外,看起来像javascript而不是打字稿

这是你在没有异步库的情况下如何做到这一点 - 你想要在没有异步库的情况下这样做的原因是因为编写混合异步库和承诺而不会破坏某些内容的代码非常困难!

注意:您至少不需要async / await ES2016 +关键字,也不需要使用它们。

并且,为了清楚起见,像async libraryasync.race这样的async.retry方法 - 与async/awaits的ES2016 + Promise语法糖没有任何关系

使用这些通用的“重试”功能之一

const retry = fn => () => fn().catch(() => retry(fn));

const limitedRetry = (cont, fn) => fn().catch(err => cont > 0 ? limitedRetry(cont - 1, fn) : Promise.reject(err));

const wait = (time, result) => new Promise(resolve => setTimeout(resolve, time, result));
const limitedRetryDelay = (cont, delay, fn) => fn().catch(err => cont > 0 ? wait(delay).then(() => limitedRetryDelay(cont - 1, delay, fn)) : Promise.reject(err));

您的代码变为(无限次重试 - 不推荐)

let winner = Promise.race([
    retry(() => agent.TEST("Q.txt")),
    retry(() => agent.TEST("R.txt")),
    retry(() => agent.TEST("S.txt")),
    retry(() => agent.TEST("T.txt")),
    retry(() => agent.TEST("U.txt")),
    retry(() => agent.TEST("V.txt")),
    retry(() => agent.TEST("W.txt")),
    retry(() => agent.TEST("X.txt")),
    retry(() => agent.TEST("Y.txt")),
    retry(() => agent.TEST("Z.txt"))
]);

或 - 限制重试次数(至10次)

    limitedRetry(10, () => agent.TEST("Q.txt")),
    ... etc

或 - 将重试次数限制为10次,重试之间延迟100ms

    limitedRetryDelay(10, 100, () => agent.TEST("Q.txt")),
    ... etc

现在,winner是比赛获胜者的承诺

你也可以

winner.then(t => {
    // t is the winning promise resolved value
});

或者,如果上面的代码位于标记为async的函数内,请将第二行更改为

let winner = await Promise.race([
... code removed for brevity
]);
// got the winner

获胜者将是获胜的解决价值

以上是关于如何在async.race函数中使用async.retry的主要内容,如果未能解决你的问题,请参考以下文章

如何在函数中模拟函数。是不是可以使用两个或多个补丁来模拟函数中的函数调用?

如何如何使用MOD函数?

如何在控制器中使用辅助函数?

如何在 Pyspark 中使用 Scala 函数?

如何在python中使用lambda函数[重复]

如何在多处理函数中传递参数以及如何使用多处理列表?