2016-02-11 19 views
6

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

+0

Sì. Se devi aspettare che finisca, dovresti usare 'setTimeout()' e chiamarlo solo quando il lavoro è terminato. –

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