JQuery AJAX 请求表现同步
Posted
技术标签:
【中文标题】JQuery AJAX 请求表现同步【英文标题】:JQuery AJAX request behaving synchronous 【发布时间】:2011-08-11 13:18:43 【问题描述】:这类似于“已回答”的问题JQuery AJAX request behaving synchronous for unknown reason
我认为 MGM 观察到的并行执行的实际问题被忽略了,实际上 $.get/$.ajax 并行执行存在问题。
看下面的sn-p:
$(function()
$(".dd").each(function()
var obj = $(this);
$.get("test.txt", function(data)
obj.html(data);
);
);
);
它加载一个文件(我希望是异步的)并显示它(当然是同步的)。
但是,代码在第一个页面加载和页面刷新期间执行不同。我正在使用 Windows 上 Firefox 4.0 中的 firebug Net 面板监视对服务器的请求。在第一个页面加载时(或使用 Ctrl-F5 刷新时),我可以在网络面板上看到对“test.txt”的多个请求同时开始,并且网络活动大多重叠。
这部分按预期工作。结果可能会在浏览器中一一处理,但对服务器的请求是并行执行的。
当用户按 F5 刷新页面时,情况就完全不同了。突然间,并行性消失了。同样的网页会一一加载“test.txt”。
如果我将数据显示 (obj.html(data);) 替换为一个简单的警报会变得更加清晰:alert(data);在初始页面加载时,我同时在屏幕上收到多条警报消息。随后的刷新 (F5) 清楚地表明,当屏幕上显示一条警报消息时,没有执行其他下载(我可以删除文件以查看下一个“$.get”失败)。
所以实际上 $.get 并不执行异步。调用服务器。
关于为什么会发生这种情况的任何想法?
附:抱歉,系统不允许我使用提供的 URL 发布图片以查看屏幕截图。
【问题讨论】:
您混淆了异步和并行执行。异步意味着浏览器在等待服务器请求时不会阻塞。浏览器实例是一个单线程进程,它不能并行执行任何操作。警报始终是一个阻塞调用,所以当警报框打开时它当然不能下载任何东西。您的初始加载和刷新之间的区别可能是浏览器在您点击刷新时重新验证其缓存,这是它应该做的。尝试使用带有大量 .dd 列表的 $.ajax( sync: true ) 调用,您会看到浏览器死机。 "browser instance" - 不确定你到底指的是什么,但浏览器是多线程的。 javascript 执行总是在单个线程中执行。你是对的。 Alert 是浏览器实现,虽然它会阻止 JavaScript 执行,但它不必阻止浏览器处理。 在初始页面加载期间,当第一个警报出现在屏幕上时,所有请求都得到处理并加载文件。如果我在屏幕上出现第一个警报时删除了文件,我不会收到任何错误并且可以看到其他警报。 (旧浏览器的行为不同,alert 实际上可以阻止一切) 初始加载和刷新之间的区别让我感到困惑。在刷新期间,浏览器甚至不会启动下一个 ajax 请求,直到前一个被完全处理。我不认为它像“重新验证其缓存”那么简单,因为浏览器有其他线程来做家务,不应该影响 javaScript 引擎线程。此外,其他资源(图片、javascript文件)是并行下载的。 【参考方案1】:经过各种测试,我倾向于同意 $.get/$.ajax 按预期异步工作。
相同的代码完全异步工作,前提是服务器不会立即响应但需要一些时间来处理请求。 由于服务器上的人为延迟,服务器上收集的日志显示请求是并行的,无论是初始页面加载还是后续刷新。 Firebug 显示相同:对服务器的调用重叠。
较短的请求似乎太快了,浏览器“决定”在启动下一个调用之前处理响应。
如前所述,异步并不意味着完全并行。
【讨论】:
以上是关于JQuery AJAX 请求表现同步的主要内容,如果未能解决你的问题,请参考以下文章
如何让 jQuery 执行同步而不是异步的 Ajax 请求?
jQuery基础(Ajax,load(),getJSON(),getScript(),post(),ajax(),同步/异步请求数据)