多步Javascript计时算法

时间:2018-10-13 17:23:05

标签: javascript node.js algorithm timeout timing

我需要编写一个具有以下要求的函数:

  • 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

我想念什么?

2 个答案:

答案 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中已经指定了参数。

msm都没有实际值时,就会出现问题。