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?
risposta
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:
- How Javascript Timers Work - written by John Resig
- Events and Timing in Depth
- W3 spec: HTML5 event loops
- MDN article on Event Loop
- Presentation on JS event queue
- The JavaScript Event Loop: Explained
- Five Patterns to Help Tame Asynchronous Javascript
- Javascript Event Loop Presentation
- Video Discussing How Javascript Works (including event loop at 10:27)
Buona risposta. I riferimenti lo renderebbero un'ottima risposta :) – Jeff
Riferimenti aggiunti. – jfriend00
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
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:
- JavaScript viene eseguito in un singolo thread per ogni browser scheda o finestra.
- Gli eventi vengono messi in coda ed eseguiti in sequenza.
- XMLHttpRequest vengono eseguiti dall'implementazione e i callback vengono eseguiti utilizzando la coda eventi.
Nota: il collegamento originale era: link, ma ora è morto.
spiegazione molto buona in breve .. – refactor
- 1. In che modo Javascript gestisce le chiamate ricorsive?
- 2. In che modo oozie gestisce le dipendenze?
- 3. In che modo Android gestisce i thread in background quando si lascia un'attività?
- 4. In che modo Monotouch gestisce le risorse (stringhe, immagini, ecc.)?
- 5. In che modo Entity Framework gestisce le transazioni?
- 6. In che modo git gestisce l'autorizzazione per le cartelle?
- 7. In che modo Akka gestisce le versioni dei messaggi?
- 8. In che modo commit_on_success gestisce l'annidamento?
- 9. In che modo jProfiler gestisce JIT?
- 10. In che modo ptr_vector gestisce la memoria?
- 11. In che modo Stream.max() gestisce l'uguaglianza?
- 12. In che modo Django Fixtures gestisce ManyToManyFields?
- 13. In che modo django gestisce più utenti
- 14. In che modo Android gestisce più R.java?
- 15. in che modo KVM gestisce l'interrupt
- 16. In che modo asm.js gestisce lo split-per-zero?
- 17. In che modo @RequestParam in Spring gestisce Opava di Guava?
- 18. In che modo Google gestisce gli errori in C++
- 19. In che modo Java gestisce gli oggetti stringa in memoria?
- 20. JavaScript - In che modo Disqus gestisce la sua funzione "disqus_config" che contiene una proprietà non definita?
- 21. In che modo la tua organizzazione gestisce i componenti comuni?
- 22. In che modo Mercurial gestisce i file divisi?
- 23. In che modo Domain Driven Design gestisce i report?
- 24. In che modo i browser gestiscono JavaScript?
- 25. In che modo Dispatcher differisce dal thread in background?
- 26. In che modo Android gestisce gli eventi della GUI?
- 27. In che modo Spring Security gestisce SecurityContext in un thread attraverso le richieste di applicazioni Web?
- 28. In che modo CLR gestisce le chiamate al metodo esterno in C#
- 29. In che modo Ruby gestisce il compito semanticamente?
- 30. In che modo Ruby gestisce l'accesso all'array dell'array?
Una descrizione abbastanza buona è qui: http://stackoverflow.com/questions/2914161/ajax-multi-threaded –
Il codice JavaScript è a thread singolo (tranne che per i web worker), ma non il browser che esegue il motore JavaScript ... –
@JuanMendes Il JavaScript viene eseguito in un thread mentre la coda eventi viene eseguita in un altro thread? –