Javascript 在哪个线程上处理和执行像AJAX请求这样的异步请求

Javascript 在哪个线程上处理和执行像AJAX请求这样的异步请求,javascript,jquery,multithreading,Javascript,Jquery,Multithreading,由于浏览器中的Javascript引擎只有一个线程,当我们使用jquery创建XHR请求时,如下所示 $.ajax({ url: "http://test.com/test.html", context: document.body }).done(function() { $( this ).addClass( "done" ); }); 对远程服务器的HTTP请求发生在哪个线程上,是哪个线程通知主线程请求已完成?首先,当浏览器加载JavaScript文件时,将执行$.ajax。

由于浏览器中的Javascript引擎只有一个线程,当我们使用jquery创建XHR请求时,如下所示

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

对远程服务器的HTTP请求发生在哪个线程上,是哪个线程通知主线程请求已完成?

首先,当浏览器加载JavaScript文件时,将执行$.ajax。XHR有两种不同的方式。首先设置
async:false
,然后在XHR之后执行后一个脚本。否则,如果我们设置
async:true
。然后发送XHR,但在服务器响应到达时处理

您必须记住javascript是在浏览器中运行的——浏览器本身使用多个线程和多个进程(尤其是在Chrome中)

当您创建一个XHR请求(这是一个抽象)时,浏览器将在其权限级别内打开一个本地TCP端口本身,并在自己的线程上运行此任务

这就是为什么JS对IO如此有效的原因——您可以考虑让浏览器打开一个本地tcp端口,然后与远程web服务器通信,就像使用node.JS连接和读取数据库一样

浏览器可以打开多个tcp连接,它们可以在引擎盖下共享,但是当响应返回时,它只能在JS事件循环中一次处理来自这些XHR请求之一(与浏览器对话的抽象)的响应


尽管如此,Worker(集群和节点中的child.fork()等)在现代JS中也可用。

这可能很有用:。还有一个非常类似的问题:。做了一个小编辑,希望能澄清你的意思。