2011-09-27 13 views
123

Poiché JavaScript viene eseguito in un singolo thread, dopo che è stata effettuata una richiesta AJAX, cosa accade effettivamente in background? Mi piacerebbe avere una visione più profonda di questo, qualcuno può far luce?In che modo JavaScript gestisce le risposte AJAX in background?

+5

Una descrizione abbastanza buona è qui: http://stackoverflow.com/questions/2914161/ajax-multi-threaded –

+3

Il codice JavaScript è a thread singolo (tranne che per i web worker), ma non il browser che esegue il motore JavaScript ... –

+0

@JuanMendes Il JavaScript viene eseguito in un thread mentre la coda eventi viene eseguita in un altro thread? –

risposta

190

Sotto le copertine, javascript ha una coda di eventi. Ogni volta che termina un thread di esecuzione di JavaScript, controlla se c'è un altro evento nella coda da elaborare. Se esiste, lo rimuove dalla coda e attiva tale evento (come un clic del mouse, ad esempio).

Il codice di rete nativo che si trova sotto la chiamata ajax saprà quando viene eseguita la risposta ajax e un evento verrà aggiunto alla coda di eventi javascript. Il modo in cui il codice nativo sa quando viene effettuata la chiamata ajax dipende dall'implementazione. Può essere implementato con thread o può anche essere gestito da un evento stesso (non ha molta importanza). Il punto dell'implementazione è che quando viene eseguita la risposta ajax, un codice nativo saprà che è fatto e inserisce un evento nella coda JS.

Se al momento non è in esecuzione Javascript, l'evento verrà immediatamente attivato e verrà eseguito il gestore di risposta ajax. Se qualcosa è in esecuzione al momento, l'evento verrà elaborato al termine del thread di esecuzione javascript corrente. Non è necessario alcun polling dal motore javascript. Quando una parte di Javascript termina l'esecuzione, il motore JS controlla solo la coda degli eventi per vedere se c'è qualcos'altro che deve essere eseguito. In tal caso, apre l'evento successivo dalla coda e lo esegue (chiamando una o più funzioni di callback registrate per quell'evento). Se nulla è nella coda degli eventi, l'interprete JS ha tempo libero (garbage collection o idle) finché qualche agente esterno non mette qualcos'altro nella coda degli eventi e lo riattiva di nuovo.

Poiché tutti gli eventi esterni passano attraverso la coda eventi e nessun evento viene mai attivato mentre javascript esegue effettivamente qualcos'altro, rimane single threaded.

Ecco alcuni articoli sui dettagli:

+6

Buona risposta. I riferimenti lo renderebbero un'ottima risposta :) – Jeff

+8

Riferimenti aggiunti. – jfriend00

+0

Grazie per quello. Sospettavo che fosse così, ma buono a sapersi per certo. Ho un ciclo for, in cui invio molte richieste "ajax". Nel mio gestore (per ogni richiesta - restituito in ordine arbitrario) eseguo del codice che potrebbe richiedere del tempo. Buono a sapersi questo dovrebbe sicuramente funzionare. – iPadDeveloper2011

15

Potete trovare here una documentazione molto completa sulla gestione degli eventi in javascript.
È scritto da un ragazzo che sta lavorando all'implementazione di javascript nel browser Opera.

Più precisamente, guardare i titoli: "Flusso di eventi", "Queuing Evento" e "non-utente Events": imparerete che:

  1. JavaScript viene eseguito in un singolo thread per ogni browser scheda o finestra.
  2. Gli eventi vengono messi in coda ed eseguiti in sequenza.
  3. XMLHttpRequest vengono eseguiti dall'implementazione e i callback vengono eseguiti utilizzando la coda eventi.

Nota: il collegamento originale era: link, ma ora è morto.

+0

spiegazione molto buona in breve .. – refactor

Problemi correlati