2013-05-09 85 views
11

我有一個思想實驗。在我的代碼中,我有一個全局變量,說var changeMe;,我正在做幾個Ajax調用。Javascript Ajax可能導致死鎖嗎?

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

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

所以changeMe值將取決於Ajax調用完成最後,這意味着最後結束將覆蓋值呼叫。

如果兩次通話都完全在的同一時間完成,同一時間戳怎麼辦?

由於Javascript是單線程的,我們通常不會遇到這個問題,但這可能會出現在setTimeout和Ajax調用的情況下。我不知道如何能夠精確地複製這個問題,所以它仍然是一個思想實驗。

那麼在多線程條件下如何處理死鎖?

我更喜歡changeMe的答案將是url1url2,以及明確的情況說明..

在此先感謝

+1

http://stackoverflow.com/questions/7575589/how-does-javascript-handle-ajax-responses-in-the-background/7575649#7575649 – 2013-05-09 08:58:35

+1

在JavaScript中,你只有一個線程,所以會有沒問題。 – erikkallen 2013-05-09 09:04:31

+0

@Ishank ...感謝fr tht ..但我沒有得到一個簡單的答案fr這個... – Sarath 2013-05-09 09:59:49

回答

13

JavaScript有一個事件隊列。這意味着它會逐個處理所有事件(用戶觸發的事件,setTimeout事件,ajax返回事件),因爲它們來自

你不能對執行順序做出假設,這絕對不是正確的選擇。這並不意味着你不能做同步。例如:

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); 
     } 
    }); 
} 

你說javascript是單線程的。那就對了。當有事件要處理時,該線程將循環並從該隊列中彈出事件。

即使這些調用在同一時間和同一時間戳上完成,也會有一個將被排隊到該事件隊列之前(因爲您的系統會按照某種順序將消息傳輸到javascript進程)。

如果你想知道JavaScript的定時器是如何工作的與該事件隊列中,我深深推薦的John Resig's blog post about it

閱讀如果您想了解網絡事件是如何傳遞給你的瀏覽器(JavaScript)的更多信息,您應該瞭解OSI Model。例如,您的瀏覽器位於OSI第7層(應用程序)中,但網絡事件的順序將在下面決定(第3層到第6層)。

那麼總結一下答案:沒有人能告訴你changeMe會是url1或url2。 Javascript不會決定這裏的訂單,它將在深層(您的網卡,您的操作系統等)中決定。

+1

這個答案聽起來很不錯,但是,包括一些在你的答案中可驗證和有信譽的引用支持你的聲明會很好。 – 2013-08-04 06:31:45

+1

@SamuelLiew:如果你沒有複製並粘貼每一個答案,你的評論會很棒。 – 2013-08-05 18:28:59

+0

除此之外,http://stackoverflow.com/questions/7575589/how-does-javascript-handle-ajax-responses-in-the-background/7575649#7575649回答這個問題。 – 2013-08-05 18:29:28

5

在Javascript中異步操作在後臺運行,但所有Javascript代碼(包括回調函數)都在前臺線程中運行。所以設計兩個回調會同時執行是不可能的。

如果兩個異步操作在完全相同的時間完成,兩者將同時表示它們的完成,然後Javascript調度器將選擇兩個回調中的一個首先運行。

哪個回調最先是實現和操作系統特定的,對於所有意圖和目的,您可以假設它是隨機的。

+0

這個答案聽起來很合理,但是,在您的答案中包括一些可驗證的信譽參考以支持您的聲明是非常好的。 – 2013-08-04 08:47:32

相關問題