【问题标题】:On which thread are asynchronous requests like AJAX request occur processed and executed在哪个线程上处理和执行 AJAX 请求等异步请求
【发布时间】:2017-07-18 01:07:42
【问题描述】:
由于浏览器中的 Javascript 引擎只有 1 个线程,所以当我们使用 jquery 创建 XHR 请求时,就像这样
$.ajax({
url: "http://test.com/test.html",
context: document.body
}).done(function() {
$( this ).addClass( "done" );
});
对远程服务器的HTTP请求发生在哪个线程上,又是哪个线程通知主线程请求完成?
【问题讨论】:
标签:
javascript
jquery
multithreading
【解决方案1】:
您必须记住 javascript 在浏览器中运行——浏览器本身使用多个线程和(尤其是在 Chrome 中)多个进程。
当您创建 XHR 请求(它是一种抽象)时,浏览器将在其权限级别内自行打开一个本地 TCP 端口,并可能在其自己的线程上运行此任务。
这就是为什么 JS 在 IO 上如此出色的原因——您可以考虑让浏览器打开一个本地 tcp 端口,然后与远程 Web 服务器通信,就像使用 node.js 连接和读取数据库一样。
浏览器可以打开多个 tcp 连接,它们可以在底层共享,但是当响应返回时,它一次只能处理来自这些 XHR 请求之一的响应(与浏览器对话的抽象)在 JS 事件循环中。
虽然,worker(集群和节点中的 child.fork())等在现代 JS 中也可用。
【解决方案2】:
首先,当浏览器加载 JavaScript 文件时,会执行 $.ajax。 XHR 有两种不同的方式。首先设置async:false,然后后一个脚本将在 XHR 之后执行。否则,如果我们设置async:true。然后发送 XHR,但将在服务器响应到达时进行处理。