Una chiamata passata alla funzione setInterval
verrà attivata anche se il precedente (attivato dallo stesso setInterval
) non è terminato il suo lavoro ancora? In tal caso, cosa posso fare per aggirare questo comportamento? Dovrei usare la mia bandiera booleana (come inProcess
) o chiamare setTimeout
ogni volta invece di setInterval
?Viene eseguita una richiamata a setInterval anche se il precedente non ha ancora terminato il proprio lavoro
6
A
risposta
0
Fondamentalmente sì, la richiamata dal setInterval (..) viene attivata anche se alcune passate precedenti non sono ancora terminate. Penso che inProcess-Flag sia la soluzione più pulita per te (anche se è più comprensibile)
1
Ti suggerisco di usare setTimeout
.
Avevo un problema simile e dovevo interrogare il server per alcuni dati ogni 3 s fino a quando non ricevo dati o viene raggiunta una soglia. Avevo scritto qualcosa di simile:
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();
vantaggio di questo approccio è,
- In primo luogo, non si deve fare
interval/timeout
variabile come global/portata genitore, in modo da poter cancellare in caso di successo. - In secondo luogo,
initTimeout
può essere fatto generico come
function initTimeout(callback, delay) {
setTimeout(function() {
callback();
}, delay);
}
Sì. Se devi aspettare che finisca, dovresti usare 'setTimeout()' e chiamarlo solo quando il lavoro è terminato. –