2012-02-09 14 views
11

Supponiamo di avere setInterval(PostToServer, 1000);. La funzione PostToServer rende un post di tipo jax, che può richiedere più di un secondo. Quindi cosa succede allora: viene effettuata una seconda chiamata mentre il primo non è terminato o è attesa la fine della chiamata prima di crearne una nuova?javascript setInterval: le chiamate si sovrappongono?

risposta

7

Le chiamate si sovrappongono.

setInterval assicura che le funzioni vengano eseguite regolarmente, senza attendere il risultato precedente.

Se si desidera attendere la risposta, modificare il metodo dell'intervallo in un polling. Quando è trascorso il tempo E il server ha già risposto, richiedi nuovamente.

Poiché la risposta del server non cambierà molto dopo la risposta, è anche possibile aggiungere un gestore setTimeout nella funzione di callback del metodo AJAX.

+0

@ jfriend00 Questa risposta è corretta. L'OP sta chiedendo se una funzione in 'setInterval' attende la fine della richiesta AJAX dal precedente metodo' setInterval', ** not ** per la fine della funzione nella precedente chiamata 'setInterval'. –

+1

Inizialmente ho letto male la domanda e ho ritirato il mio commento e il mio voto negativo. Inizialmente ho pensato che stessero chiedendo se due chiamate callback SetInterval potessero sovrapporsi (che non possono). Non ho visto che stavano parlando di chiamate ajax innescate da un intervallo. – jfriend00

8

Javascript è un singolo thread (tranne per i web worker HTML5 non coinvolti in questo problema) con una coda eventi. Una chiamata successiva da setInterval() non si avvierà mai fino a quando non viene effettuata la chiamata precedente. Solo uno può essere attivo alla volta.

Quando si verifica il tempo dell'intervallo, interno al motore JS il timer scatta e un evento viene aggiunto alla coda eventi javascript. Quando il thread di esecuzione JS attualmente in esecuzione termina (e non prima), il motore JS va e recupera l'evento successivo dalla coda degli eventi e avvia quel thread di esecuzione JS. Quindi due percorsi di esecuzione in JS non si sovrappongono mai o si succedono allo stesso tempo. Quindi, le chiamate a due funzioni da setInterval() non si sovrappongono mai. Il secondo non si avvierà fino a quando non si eseguirà il primo.

Tuttavia, in relazione alla domanda, significa che due intervalli da setInterval() non si sovrappongono mai, ma se si sta effettuando una chiamata ajax asincrona sul primo intervallo e l'inizio della chiamata ajax termina immediatamente, e il secondo intervallo si attiva prima che la prima chiamata asincrona ajax abbia attivato la funzione di completamento, quindi le chiamate ajax si sovrappongono o possono sovrapporsi.

Se si desidera impedire la presenza di più di una chiamata ajax in volo alla volta, è necessario scrivere del codice per impedire specificamente che non si attivi la seconda chiamata ajax fino a quando non è stata completata la precedente o semplicemente si salta qualsiasi chiamata ajax se la precedente è ancora in corso.

Vedere this post per ulteriori informazioni sulla coda eventi JS e come funziona.

1

Sì, si sovrappone. È possibile utilizzare setTimeout nella funzione PostToServer per assicurarsi che non si sovrapponga, ma il problema è che viene eseguita la richiesta e quindi attendere 1 secondo e quindi eseguire nuovamente la richiesta. Quindi non funziona esattamente ogni secondo.

Per ulteriori informazioni, vedere questo video di Paul Irish: http://youtu.be/i_qE1iAmjFg?t=7m46s

Problemi correlati