2015-07-11 27 views
2

由於在瀏覽器中的Javascript引擎具有僅1個線程,當我們創建使用jquery一個XHR請求,像這樣論哪個線程是像AJAX請求異步請求發生處理和執行

$.ajax({ 
    url: "http://test.com/test.html", 
    context: document.body 
}).done(function() { 
    $(this).addClass("done"); 
}); 

在其上線程做的HTTP向遠程服務器發出請求,以及通知主線程請求已完成的線程是什麼?

+0

這可能很有用:[JavaScript如何在後臺處理AJAX響應?](http://stackoverflow.com/questions/7575589/how-does-javascript-handle-ajax-responses-in-the-background/7575649#7575649)。和這個問題非常相似的問題:[JS是否在操作系統級別使用非阻塞I/O來支持AJAX?](http://stackoverflow.com/questions/9998433/do-js-use-non-blocking-io -at-OS級到支撐AJAX/9998602#9998602)。 – jfriend00

回答

2

您必須記住JavaScript在瀏覽器中運行 - 瀏覽器本身使用多個線程和(尤其是在Chrome中)多個進程。

當您創建XHR請求(這是一個抽象)時,瀏覽器將在其權限級別內打開一個本地TCP端口,並可能在其自己的線程上運行此任務。

這就是爲什麼JS能夠很好地處理IO - 您可以考慮讓瀏覽器打開一個本地tcp端口,然後與遠程web服務器通信,就像使用node.js連接和讀取數據庫一樣。

瀏覽器可以打開多個tcp連接,它們可以在引擎蓋下共享,但是當響應返回時,它只能處理來自這些XHR請求之一的響應(對瀏覽器的抽象)時間在JS事件循環中。

儘管工人(節點中的clustering和child.fork())等在現代JS中也可用。

+0

做了一個小編輯,希望澄清你的意思。 – jpaugh

0

首先,當瀏覽器加載JavaScript文件時,然後執行$ .ajax。 XHR有兩種不同的方式。首先是設置async:false然後後面的腳本將在XHR之後執行。否則,如果我們設置async:true。然後發送XHR,但在服務器響應到達時處理。