In che modo JavaScript gestisce le risposte AJAX in background?

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?

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 triggers tale evento (come un clic del mouse, ad esempio).

Il networking del codice nativo che si trova sotto la chiamata ajax saprà quando viene eseguita la risposta ajax e un evento verrà aggiunto alla coda degli 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 triggersto e verrà eseguito il gestore della 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 ritriggers di nuovo.

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

Ecco alcuni articoli sui dettagli:

  • Come funzionano i timer Javascript – scritto da John Resig
  • Eventi e tempistiche in profondità
  • Specifiche W3: loop di eventi HTML5
  • Articolo MDN su Event Loop
  • Presentazione sulla coda degli eventi JS
  • Il ciclo di eventi JavaScript: spiegato
  • Cinque pattern per aiutare a domare il Javascript asincrono
  • Presentazione del ciclo di eventi Javascript
  • Video Discutendo su come funziona JavaScript (incluso il ciclo degli eventi alle 10:27)

Puoi trovare qui una documentazione molto completa sulla gestione degli eventi in javascript.
È scritto da un ragazzo che lavora all’implementazione di javascript nel browser Opera.

Più precisamente, guarda i titoli: “Flusso di eventi”, “Accodamento eventi” e “Eventi non utente”: imparerai che:

  1. Javascript viene eseguito in un singolo thread per ogni scheda o finestra del browser.
  2. Gli eventi sono accodati ed eseguiti sequenzialmente.
  3. XMLHttpRequest vengono eseguiti dall’implementazione e i callback vengono eseguiti utilizzando la coda eventi.

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