0

众所周知,浏览器是单线程的,它既可以渲染 UI,也可以执行 Javascript 代码片段。(webworker 是使其成为多线程的可能方法,但让我们坚持默认行为)。

我有兴趣知道的是,当我们进行 jQuery ajax 调用时

$.ajax(....)

它不会阻塞 Javascript 线程,它是如何发生的?

1)浏览器向服务器发出请求时会做什么?

2)当服务器响应数据时,浏览器的实现是否允许Javascript监听此类事件以允许承诺履行处理程序。

我在问这个问题,因为我注意到建议通过使用 AsyncTask 框架创建一个单独的线程来下载 Android 中的文件。为什么 Android 不能以与 Javascript 相同的方式实现。

4

1 回答 1

1

首先,它与 jQuery ajax 调用无关,而是与 javascript ajax 调用有关。(完全尊重 jQuery)。

浏览器向服务器发出请求时会做什么?

浏览器将命令添加到队列中。
主线程(以及它必须做的其他未来事情 ) - 执行(当量子到达时)来自队列的命令。

注意
浏览器本身(chrome.exe,Iexplore.exe)确实使用多线程来处理/运行ajax。(我们正在谈论显然使用多线程的exe程序)。

但是当有来自服务器的响应时——(现在我们回到同一个旧的单线程浏览器)——它被添加到一个回调队列中,由一个主线程处理(当它的时间量到达时)浏览器。

注意:有一个项目添加到队列中并不意味着它会立即自动执行:

这张图很好地解释了它:

(相关信息:JS中有两个主要的异步操作:setTimeout(或setInterval),Ajax)

在此处输入图像描述

当服务器响应数据时,浏览器的实现是否允许 Javascript 侦听此类事件以允许承诺履行处理程序。

Ajax (xmlhttpobject) 对象具有根据状态引发的处理程序。所以它在实现本身中。再次 - 与 jQuery 无关。

值得一提的是,html5 支持允许真正的多线程的网络工作者。

于 2013-10-13T08:17:47.407 回答