如何在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而不是打字稿 - 作为问题中的代码,除了
public
的racemethod
限定符之外,看起来像javascript而不是打字稿
这是你在没有异步库的情况下如何做到这一点 - 你想要在没有异步库的情况下这样做的原因是因为编写混合异步库和承诺而不会破坏某些内容的代码非常困难!
注意:您至少不需要async
/ await
ES2016 +关键字,也不需要使用它们。
并且,为了清楚起见,像async library
,async.race
这样的async.retry
方法 - 与async/await
s的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的主要内容,如果未能解决你的问题,请参考以下文章