2015-07-04 26 views
5

Czytam to:Pętla zdarzeń JavaScript. Wyjaśnienie potrzebne

http://blog.carbonfive.com/2013/10/27/the-javascript-event-loop-explained/

Jest taki cytat:

„pojedynczy wątek wykonania pyta runtime wykonać operację , zapewniając funkcję zwrotną, a następnie przenosi po wykonaniu innej czynności, po zakończeniu operacji, pojawi się komunikat wraz z dostarczoną funkcją oddzwaniania. W pewnym momencie w w przyszłości komunikat zostanie usunięty i oddzwonił. "

więc przykładem tego, co dzieje się w moim umyśle to:

console.log("x") 
someAjaxCall(function({ 
callbackcode 
}) 
console.log("y") 

Pytania:
1) someAjaxCall jest właściwa eksploatacja i callbackcode jest zwrotna?
2) Więc w zasadzie, gdy someAjaxCall jest wywoływane, kolejkowa wiadomość wskazująca na poprawną funkcję wywołania zwrotnego? Po wywołaniu konsoli.log ("y") lub po opróżnieniu stosu komunikat jest usuwany z kolejki i wywoływany jest kod wywołania zwrotnego/wywołania zwrotnego?

Potem jest ten cytat:

„Oddzielenie rozmówcy z odpowiedzi pozwala na JavaScript wykonywania robić inne rzeczy podczas oczekiwania na asynchronicznej operacji kompletne i ich wywołania zwrotne do ognia”.

3) Co to jest środowisko wykonawcze? Co to znaczy? Po prostu biorę to pod uwagę, że callstack może wznowić wykonywanie, a kiedy to opróżni ... wiadomości mogą następnie usunąć?

+0

Odpowiedź na to pytanie [Jak JavaScript obsługuje odpowiedzi AJAX w tle?] (Http://stackoverflow.com/questions/7575589/how-does-javascript-handle-ajax-responses-in-the-background/7575649 # 7575649) prawdopodobnie odpowiada na większość tego, o co prosisz. To pytanie może nawet dupę tego. – jfriend00

Odpowiedz

0

Javascript runtime to oprogramowanie, które wykonuje cały kod Javascript. Oznacza to, że podczas gdy JavaScript czeka na odpowiedź na wywołanie AJAX, może uruchamiać inne rzeczy. Na przykład można wyświetlać "Proszę czekać ..." za pomocą pokrętła, czekając, aż serwer wykona długie zapytanie bazy danych. Po otrzymaniu odpowiedzi wywołanie zwrotne zostanie wykonane i może zatrzymać wirowanie i wyświetlić dane.

0

Pomyśl silnika JavaScript, co szuka czegoś takiego za kulisami:

while(true) { 
    var event = updateUIAndDoNetworkingStuffAndWaitForIncomingEvent(); 
    if(event.hasJavaScriptHandler) { 
     event.runJavaScriptHandlerForEvent(); 
    } 
} 

W pewnym momencie Twój kod działa. Ty console.log("x"), uruchom funkcję someAjaxCall, a następnie uruchom console.log("y"). Wewnętrznie, someAjaxCall prawdopodobnie modyfikuje jakiś stan, którego nie widzisz, który mówi przeglądarce "hej, kiedy dostaniesz się do updateUIAndDoNetworkingStuffAndWaitForIncomingEvent, jako część" robienia rzeczy sieciowych ", również wykonaj to żądanie HTTP, a kiedy skończysz, uruchom wydarzenie". Jako część tego rekordu przechowuje twoją funkcję zwrotną. Następnie, kilka razy później przez pętlę, updateUIAndDoNetworkingStuffAndWaitForIncomingEvent widzi, że żądanie HTTP lub cokolwiek zostało zakończone, i zwraca zdarzenie z informacją "hej, ta prośba HTTP, którą prosiłem, abym zrobił jakiś czas temu - dobrze, to się skończyło!" Kod po nim zauważa, że ​​był wywołanie zwrotne, które odkłada i wywołuje to, a twój kod wznawia działanie w ramach wywołania zwrotnego, które przekazałeś do someAjaxCall.

Powiązane problemy