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
6
A
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);
}
Tak. Jeśli chcesz poczekać, aż się skończy, powinieneś użyć 'setTimeout()' i wywołać je tylko po zakończeniu pracy. –