有时我需要AJAX一个巨大的JSON有效载荷(~20MB)。在此过程中,浏览器窗口似乎不断加载(最新的Chrome,Windows 8.1)。用户可以点击链接等内容,但在AJAX请求完成之前,浏览器实际上不会访问这些链接。这可能是一个问题,因为如果你去一个需要这样一个AJAX调用的页面,很难导航。不幸的是,此时我无法减少有效载荷的大小(我正在加载图形,有时图形是数十万个节点和边缘)。
任何想法为什么浏览器不会离开(即使浏览器响应)?并且,如果可能,任何可能的解决方案?谢谢!
答案 0 :(得分:6)
我建议使用an HTML5 Web Worker。浏览器支持不是很好,特别是对于IE。
Web worker是非阻塞的,这意味着您可以同时运行两个脚本。这将在您在后台进行AJAX调用时释放您的DOM。
Here is one article I could find on using web workers with an AJAX call.
答案 1 :(得分:3)
我不知道如何解决您所面临的确切技术问题。然而,这仍然有用。考虑使用Google或Facebook,您可以将完整的个人资料下载为包含所有历史记录和照片的存档。记下他们是如何做到的(不是通过AJAX调用)。我相信他们选择这种方式是因为你遇到了同样的问题。只是想一想。
答案 2 :(得分:3)
setTimeout()
的解决方案,它在浏览器事件队列中创建了一个单独的事件。这基本上就是我做的:
jQuery(document).ready(function() {
setTimeout(function () {
$.ajax({
url: "/longAjaxCall",
dataType: "json"
}).done(function() {
// do whatever ...
});
}, 0);
});
不确定您是否使用jQuery,但无论基本原理是否相同。
答案 3 :(得分:3)
我最初会发送一个MD5 sum
和一个chunk number
来将数据划分为多个块。我会制作一个慢慢要求它们的js
脚本。然后加入它,稍后检查是否正确发送了完整数据,最后使用它。
答案 4 :(得分:0)
我能想到的唯一两件事就是,就像许多人已经说过的那样,你的AJAX调用不是异步的,或者你可能已经用完了该浏览器可用的所有并行http连接线程。 AJAX调用阻止了一个,因此根据您允许用户执行的其他交互,可能是您只是在后台下载图像和脚本并且有效地阻止用户向前移动直到任何一个完成。 / p>
20 MB确实是一大块,所以我也同意其他人的观点,也许你应该探索在可能的情况下实现你需要的其他方法。