Многошаговый алгоритм синхронизации Javascript - PullRequest
0 голосов
/ 13 октября 2018

Мне нужно написать функцию со следующими требованиями:

  • Запуски f(A) каждые m секунд

  • f(A)делает HTTP-запрос f(B) каждые 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 голосов
/ 13 октября 2018

В вашем коде функция runTests() вызывается без параметра, что нормально, так как внутри функции, которую вы указали let runTestsMS = ms || m.

Проблема возникает, когда ни ms, ни m не имеют фактических значений.

0 голосов
/ 13 октября 2018

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);
  }
}
...