2010-03-16 10 views
35

Ho un pezzo di Javascript che controlla una condizione (tramite una chiamata AJAX) ogni n secondi. Se quella condizione è vera, smette di controllare. Ho implementato nel modo seguente:È OK chiamare clearInterval all'interno di un gestore di setInterval?

var stopTimer; 
var timerId = setInterval(function() { 

    /* Make Ajax Calls and set stopTimer */ 

    if (stopTimer) { 
     clearInterval(timerId); 
    } 
}, 10000); 

Tuttavia, ritengo che il comportamento irregolare: a volte funziona, ma altre volte, mantiene il controllo per sempre. Ho controllato che (per quanto possibile) non ci siano errori in nessuna parte del codice.

Sono quindi sospettando che chiamare clearInterval all'interno di un gestore di setInterval potrebbe essere il colpevole. È giusto? È corretto chiamare clearInterval all'interno di un gestore di setInterval?

Grazie per l'attenzione

risposta

19

È sicuro. Il problema è probabilmente dovuto al fatto che stopTimer non viene impostato come previsto.

+0

Grazie. Verificherà e condividi i risultati –

3

Non penso che ci sarà alcun problema con il vostro codice a meno che la funzione AJAX sia errata. Devi occuparti del successo e dei callback degli errori della funzione AJAX in modo che non ci siano problemi con il loop che non viene fermato.

Inoltre, penso che si stia costantemente interrogando il server per una risposta e quindi facendo l'azione appropriata. È possibile utilizzare Reverse AJAX per eseguire questo tipo di processo.

+0

Grazie. Sì, è possibile che il round-time per il completamento dell'Ajax possa interferire con l'intervallo di ripetizione impostato da setInterval. Verificherà questo e condividerà i risultati –

1

Assicurarsi di non riutilizzare inavvertitamente lo stesso nome del timer in altre parti del codice, il che comporterebbe l'arresto del secondo timer da definire.

O dare il timer un nome univoco, o entità ad una funzione

var timerForAjax = setInterval(function() { 

    /* Make Ajax Calls and set stopTimer */ 

    if (stopTimer) 
    { 
     clearInterval(timerForAjax); 
    } 
}, 10000); 

ero abbastanza imprudente di chiamare il mio timer interval e non mi rendevo conto che stavo creando due timer nello stesso ambito sia chiamato interval. Incolpato iOS8 per circa un'ora fino a quando ho capito che that non aveva niente a che fare con questo.

+0

se questo è ciò che avevi fatto allora spiegherebbe perché stava controllando per sempre –

Problemi correlati