2013-05-09 9 views
11

Mam eksperyment myślowy. W moim kodzie mam zmienną globalną, powiedzmy var changeMe; i wykonuję kilka wywołań Ajax.Czy JavaScript Ajax może prowadzić do zakleszczeń?

//call One -- third param is the callback function 
    ajaxFunction(url1, params,function(data){ 
     changeMe = data; 
    }); 

//call Two 
    ajaxFunction(url2, params,function(data){ 
     changeMe = data; 
    }); 

Więc changeMe wartość będzie zależeć od którego Ajax zadzwonić wykończeń ostatni, co oznacza połączenie, które zakończy ostatni zastąpi wartość.

Co, jeśli oba połączenia kończą się dokładnie na w tym samym czasie, z tym samym znacznikiem czasu?

Ponieważ Javascript jest jednowątkowy, zwykle nie otrzymamy tego problemu, ale może się to zdarzyć w przypadku połączeń setTimeout i Ajax. Nie wiem, w jaki sposób mogę dokładnie i precyzyjnie odtworzyć ten problem, więc nadal pozostaje to eksperyment myślowy.

W jaki sposób w warunkach wielowątkowych obsługiwany jest zakleszczenie?

wolę odpowiedź jak changeMe będzie url1 lub url2 i jasne wyjaśnienie sytuacji ..

góry dziękuję

+1

http://stackoverflow.com/questions/7575589/how-does-javascript-handle-ajax-responses-in-the-background/7575649#7575649 –

+1

W JavaScript masz tylko jeden wątek, więc nie będzie nie ma problemu. – erikkallen

+0

@Ishank ... dzięki fr tht..bez nie dostałem prostej ans fr ... – Sarath

Odpowiedz

13

JavaScript kolejkę zdarzeń. Oznacza to, że obsługuje on WSZYSTKIE zdarzenia (zdarzenia wyzwalane przez użytkownika, zdarzenia setTimeout, zdarzenia zwrotów ajaxowych) jeden po drugim, ponieważ przychodzą one pod numer.

Nie można przyjmować założeń dotyczących kolejności wykonania, to zdecydowanie nie jest właściwa droga. Nie oznacza to, że nie można wykonać synchronizacji. Na przykład:

function processURLs() { 
    var url1 = "http://www.url1.com/"; 
    var url2 = "http://www.url2.com/"; 
    var data1 = null; 
    var data2 = null; 

    ajaxFunction(url1, params, function(data){ 
     data1 = data; 
     if(data2 !== null) { 
      process(data1, data2); 
     } 
    }); 

    ajaxFunction(url2, params, function(data){ 
     data2 = data; 
     if(data1 !== null) { 
      process(data1, data2); 
     } 
    }); 
} 

Powiedziałeś, że javascript jest pojedynczym wątkiem. Zgadza się. Wątek ten zapętla się i wyskakuje zdarzenia z tej kolejki, gdy istnieją zdarzenia do przetworzenia.

Nawet jeśli połączenia zakończyły się dokładnie w tym samym czasie i tym samym sygnaturą czasową, pojawi się taki, który będzie kolejkowany do tej kolejki zdarzeń przed drugą (ponieważ twój system będzie przekazywał wiadomości do procesu javascript w jakiejś kolejności).

Jeśli chcesz wiedzieć jak zegar javascript działa z tej kolejki zdarzeń, głęboko polecam lekturę John Resig's blog post about it

Jeśli chcesz uzyskać więcej informacji o jak zdarzenia sieciowe są przekazywane do przeglądarki (JavaScript) , powinieneś się nauczyć o OSI Model.

Na przykład twoja przeglądarka znajduje się w warstwie 7 OSI (Aplikacja), ale kolejność zdarzeń sieciowych zostanie określona poniżej (warstwy od 3 do 6).

Podsumowując odpowiedź: nikt nie może ci powiedzieć, że zmiana będzie url1 lub url2. Javascript nie zdecyduje o tym zamówieniu, zadecyduje to w głębszych warstwach (karta sieciowa, system operacyjny itp.).

+1

Ta odpowiedź wydaje się jednak brzmieć, łącznie z pewnymi sprawdzalnymi i renomowanymi referencjami w odpowiedzi na poprzyj swoje roszczenie byłoby doskonałe. –

+1

@SamuelLiew: Twój komentarz byłby doskonały, gdybyś nie skopiował i nie wkleił ich przy każdej odpowiedzi. –

+0

Poza tym http://stackoverflow.com/questions/7575589/how-does-javascript-handle-ajax-responses-in-the-background/7575649#7575649 odpowiada na pytanie. –

5

W języku JavaScript operacje asynchroniczne są uruchamiane w tle, ale cały kod JavaScript, w tym wywołania zwrotne, działa w wątku pierwszoplanowym. Zasadniczo niemożliwe jest, aby dwa wywołania zwrotne były wykonywane w tym samym czasie.

Jeśli dwie asynchroniczne operacje zakończą się w tym samym czasie, oba będą sygnalizować ich zakończenie w tym samym czasie, a następnie program planujący JavaScript wybierze jedno z dwóch wywołań zwrotnych, które zostaną uruchomione jako pierwsze.

To, oddzwanianie jest pierwsze, to implementacja i specyficzny system operacyjny, dla wszystkich celów i celów można założyć, że będzie losowa.

+0

Ta odpowiedź wydaje się jednak brzmieć pozytywnie, łącznie z pewnymi sprawdzalnymi referencjami, które można zweryfikować w odpowiedzi na poparcie Twojego twierdzenia. –

Powiązane problemy