2015-07-11 29 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,但在服务器响应到达时处理。