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

Aru*_*Das 4 javascript jquery multithreading

由于浏览器中的 Javascript 引擎只有 1 个线程,因此当我们使用 jquery 创建 XHR 请求时,就像这样

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

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

ada*_*hts 6

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

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

这就是 JS 对 IO 如此有效的原因——您可以认为让浏览器打开本地 tcp 端口,然后与远程 Web 服务器通信,类似于使用 node.js 连接和读取数据库。

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

虽然,现代 JS 中也可以使用工作程序(节点中的集群和 child.fork())等。