我需要编写一个具有以下要求的函数:
每f(A)
秒运行m
f(A)
每f(B)
秒发出一次HTTP请求n
如果请求f(B)
在单个o
测试中连续f(A)
次失败,则每f(A)
秒运行一次下一个p
如果f(B)
在一次o
测试中连续f(A)
次未失败,则下一个f(A)
每隔m
秒运行一次,如下所示:通常。
我能够做到这一点:
function runTests(ms) {
let runTestsMS = ms || m;
setTimeout(() => {
let count = 0;
setInterval(async () => {
try {
await axios.get('...');
count = 0;
runTestsMS = ms || m;
} catch (error) {
count += 1;
if (count === o) {
runTests(p);
}
}
}, n);
runTests(runTestsMS);
}, runTestsMS);
}
runTests();
此功能不执行以上规则3。如果连续失败,则下一个f(A)
秒仍将运行下一个m
。
我想念什么?
答案 0 :(得分:0)
setInterval
立即返回,无需等待任何内容。您必须await
在循环内使用计时器:
const timer = ms => new Promise(res => setTimeout(res, ms);
async function runTests(ms) {
while(true) {
let count = 0;
while(count < 3) {
try {
await axios.get('...');
break;
} catch (error) {
count += 1;
await timer(n);
}
}
await timer(m);
}
}
答案 1 :(得分:0)
在您的代码中,函数runTests()
的调用没有参数,这是可以的,因为在函数let runTestsMS = ms || m
中已经指定了参数。
当ms
和m
都没有实际值时,就会出现问题。