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

时间:2018-03-01 05:25:02

标签: node.js typescript ecmascript-6 promise async-await

我在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

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

谢谢,

1 个答案:

答案 0 :(得分:0)

  

警告:答案中的代码是针对javascript的,而不是打字稿 - 因为问题中的代码除了public的{​​{1}}限定符外,看起来像javascript而不是打字稿

以下是你如何做没有异步库 - 你想要在没有异步库的情况下这样做是因为它是因为它很难编写混合异步库和promises的代码而不会破坏某些内容!

注意:您也不需要racemethod / async ES2016 +关键字,至少不会像使用它们那样频繁

而且,为了清楚起见,awaitasync libraryasync.race方法与async.retry的ES2016 + async/await语法糖毫无关系}Š

使用其中一种通用"重试"功能

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));

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

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次,重试之间的延迟时间为100ms

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

现在, limitedRetryDelay(10, 100, () => agent.TEST("Q.txt")), ... etc 是比赛获胜者的承诺

你可以

winner

或者,如果上面的代码位于标记为winner.then(t => { // t is the winning promise resolved value }); 的函数内,请将第二行更改为

async

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