我在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
我是新手,所以任何建议都将受到赞赏。
谢谢,
答案 0 :(得分:0)
警告:答案中的代码是针对javascript的,而不是打字稿 - 因为问题中的代码除了
public
的{{1}}限定符外,看起来像javascript而不是打字稿
以下是你如何做没有异步库 - 你想要在没有异步库的情况下这样做是因为它是因为它很难编写混合异步库和promises的代码而不会破坏某些内容!
注意:您也不需要racemethod
/ async
ES2016 +关键字,至少不会像使用它们那样频繁
而且,为了清楚起见,await
,async library
等async.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
并且获胜者将是获胜的解决价值