【问题标题】: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,但将在服务器响应到达时进行处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 2013-03-27
    • 1970-01-01
    • 2019-06-24
    • 2019-06-04
    相关资源
    最近更新 更多