2013-10-13 27 views
0

正如我們所知,瀏覽器是單線程的,它可以呈現UI或執行JavaScript片段。 (webworker是使其成爲多線程的可能方式,但讓我們堅持默認行爲)。Javascript和jQuery Ajax - 它是如何工作的?

我有什麼想知道的是,當我們做一個jQuery的AJAX調用

$.ajax(....) 

它不會阻止JavaScript的線程,它是如何發生的呢?

1)瀏覽器在向服務器發送請求時做了什麼?

2)當服務器用數據響應時,允許Javascript監聽這樣的事件以允許承諾實現的處理程序是瀏覽器的實現。

我在問這個問題,因爲我注意到,推薦使用AsyncTask框架爲Android中的文件下載創建一個單獨的線程。爲什麼Android不能像Javascript那樣實現。

回答

1

首先它與jQuery ajax調用無關,但與javascript ajax調用相關。 (與jQuery的所有方面)。

瀏覽器在向服務器發送請求時做了什麼?

瀏覽器將該命令添加到隊列中。
主線程(以及其他將來要做的事情) - 執行(,當它的時間量子到達)來自隊列的命令。

NB
瀏覽器本身(的chrome.exe,Iexplore.exe的)確實使用多線程,以便處理/運行AJAX。(我們談論的exe程序,這顯然不使用多線程)。

但是,當有來自服務器的響應 - (現在我們又回到了老單個線程瀏覽器) - 它被添加到該處理的回調隊列(當它的時間量子到達)由相同瀏覽器的單主線程。

注意:事實上,有添加到隊列中的項目並不意味着它會立即自動執行:

這張照片explains非常好:

(相關信息:有2在JS主要異步操作:的setTimeout(或setInterval的),阿賈克斯)

enter image description here

當服務器響應數據時,瀏覽器的實現是否允許Javascript監聽這樣的事件,以允許 爲承諾履行處理程序。

Ajax(xmlhttpobject)對象具有根據狀態引發的處理程序。所以它在實現本身。再次 - 沒有關係到jQuery。

值得一提的是,html5支持web workers,它允許真正的多線程。

+0

當您提到瀏覽器本身(chrome.exe,Iexplore.exe)確實使用多線程來處理/運行ajax(我們正在討論顯然確實使用多線程的exe程序)。 是否有任何資源可以指向它,顯示此特定調用在瀏覽器上使用多線程? –

+0

@SteveNg這可以很簡單地檢查。只需打開一個Ajax命令而不從服務器釋放它,然後打開(通過setTimeout)另一個。你會看到它正在工作。所以必須有另一個線程。 –

+0

@SteveNg(再次 - 不是js循環單線程,而是應用程序線程) –

相關問題