2016-02-11 9 views
6

Czy wywołanie zwrotne przekazane do funkcji setInterval zostanie wywołane, nawet jeśli poprzedni (uruchomiony tym samym setInterval) nie został zakończony jego praca jeszcze? Jeśli tak, co mogę zrobić, aby obejść to zachowanie? Czy należy używać własnej flagi binarnej (np. inProcess) lub dzwonić pod numer setTimeout za każdym razem zamiast setInterval?Czy wywołanie zwrotne przekazane do setInterval zostanie uruchomione, nawet jeśli poprzednie nie zakończyło jeszcze swojej pracy

+0

Tak. Jeśli chcesz poczekać, aż się skończy, powinieneś użyć 'setTimeout()' i wywołać je tylko po zakończeniu pracy. –

Odpowiedz

0

Zasadniczo tak, wywołanie zwrotne z setInterval (..) jest uruchamiane, nawet niektóre poprzednie instrukcje nie są jeszcze zakończone. Myślę, że flaga inProcess jest najbardziej czystym rozwiązaniem dla ciebie (nawet najbardziej zrozumiałym).

1

Sugerowałbym użycie setTimeout.

Miałem podobny problem i gdzie musiałem odpytywać serwer dla pewnych danych co 3 s, aż otrzymam dane lub osiągnięty zostanie próg. Napisałem coś takiego:

function getData(){ 
    $.post(url,data, function(res){ 
    if((res.error || res.data.length === 0) && pollCount < 20){ 
     initTimeout(); 
    } 
    else{ 
     processData(res.data); 
    } 
    }) 
} 

function initTimeout(){ 
    var delay = 3000; 
    setTimeout(function(){ getData(); },delay) 
} 

initTimeout(); 

zaletą tego podejścia jest to,

  • Po pierwsze, nie trzeba wprowadzać interval/timeout zmienną jako global/w zakresie dominującej, więc można wyczyścić na sukces.
  • drugie initTimeout można rodzajowy jak
function initTimeout(callback, delay) { 
    setTimeout(function() { 
    callback(); 
    }, delay); 
} 
Powiązane problemy