Как setInterval работает асинхронно - PullRequest
0 голосов
/ 31 августа 2018

У меня есть функция setInterval, которая запускает асинхронный код, который вызывает сервер:

setInterval(()=> {
    //run AJAX function here
}, 5000);

Если сервер не получит ответ в течение 5 секунд, скорее всего, он снова запустит установленный интервал, который затем сделает несколько запросов к одной и той же конечной точке, есть ли способ, что setInterval только начинает свои следующие 5 секунд выполнения после Функция AJAX возвращает ответ?

Ответы [ 3 ]

0 голосов
/ 31 августа 2018

Используйте setTimeout вместо

function myTimer = () => {
  setTimeout(()=> {
    //run AJAX function here
    ajaxFunc();
  }, 5000);

function ajaxFunc() {
  //case success
    //do something
  // case failure
    // do something
  // finally
    myTimer();
}

myTimer()
0 голосов
/ 31 августа 2018

что вы хотите сделать, это использовать setTimeout всякий раз, когда вы получаете ответ

вот какой-то псевдокод

const doAjaxWithDelay = (delay)=>{
  setTimeout(()=>{
    $.ajax({
    ...
    }).done(()=>{
    // do your staff 
      doAjaxWithDelay(5000)
    })
  },delay)
}
doAjaxWithDelay(0);
0 голосов
/ 31 августа 2018

Я бы добавил счетчик так:

var counter1 = 1;
var counter2 = 0;
setInterval( function() {

    if ( counter1 > counter2 ) {
        setTimeout( function() { /*Run Ajax Here*/ }, 5000 );
        counter2++;
     }

    else { console.log("Ajax hasn't responded yet"); }

});

Если ответ успешный, counter1 ++; Поместите это в код AJAX.

...