首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >多步Javascript计时算法

多步Javascript计时算法
EN

Stack Overflow用户
提问于 2018-10-14 01:23:05
回答 2查看 35关注 0票数 0

我需要编写一个满足以下要求的函数:

  • f(A) m
  • f(A)m f(B) n
  • 如果请求f(B)在单个<代码>D13测试中连续失败,则每隔<代码>D15秒
  • 运行一次。如果f(B)在一次f(A)测试中未连续失败o,则会照常每隔m秒运行下一个D21。

F224

我可以这样做:

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秒运行一次。

我遗漏了什么?

EN

回答 2

Stack Overflow用户

发布于 2018-10-14 01:28:05

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);
  }
}
票数 0
EN

Stack Overflow用户

发布于 2018-10-14 01:36:55

在您的代码中,不带参数调用函数runTests(),这是可以的,因为在函数中您已经指定了let runTestsMS = ms || m

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52795467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档