由于浏览器中的Javascript引擎只有1个线程,因此当我们使用jquery创建XHR请求时,就像这样
$.ajax({
url: "http://test.com/test.html",
context: document.body
}).done(function() {
$( this ).addClass( "done" );
});
在哪个线程上发出对远程服务器的HTTP请求,以及通知主线程请求已完成的线程是什么?
答案 0 :(得分:2)
你必须记住javascript在浏览器中运行 - 浏览器本身使用多个线程和(特别是在Chrome中)多个进程。
当您创建XHR请求(它是抽象)时,浏览器将在其权限级别内打开本地TCP端口,并可能在其自己的线程上运行此任务。
这就是为什么JS在IO上运行良好的原因 - 您可以考虑让浏览器打开本地tcp端口,然后与远程Web服务器通信,类似于使用node.js连接和读取数据库。
浏览器可以打开多个tcp连接,它们可以在底层共享,但是当响应返回时,它只能处理来自这些XHR请求之一的响应(抽象与浏览器通信)在JS事件循环中。
虽然现代JS中也提供了worker(节点中的clustering和child.fork()等)。
答案 1 :(得分:0)
首先,当浏览器加载JavaScript文件时,然后将执行$ .ajax。 XHR有两种不同的方式。首先设置async:false
然后后一个脚本将在XHR之后执行。否则,如果我们设置async:true
。然后XHR发送,但在服务器响应到达时将处理。