有时我必须为AJAX提供巨大的JSON负载(〜20MB)。在这个过程中,似乎浏览器窗口不断加载(最新的Chrome,Windows 8.1)。用户可以点击链接等东西,但浏览器在AJAX请求完成之前不会真正进入这些链接。这可能是一个问题,因为如果您转到需要这种AJAX调用的页面,则很难离开。不幸的是,目前我无法减小有效负载的大小(我正在加载图形,有时图形有数十万个节点和边缘)。不间断ajax请求
任何想法为什么浏览器不会离开(即使浏览器响应)?如果可能,还有什么潜在的解决方案?谢谢!
有时我必须为AJAX提供巨大的JSON负载(〜20MB)。在这个过程中,似乎浏览器窗口不断加载(最新的Chrome,Windows 8.1)。用户可以点击链接等东西,但浏览器在AJAX请求完成之前不会真正进入这些链接。这可能是一个问题,因为如果您转到需要这种AJAX调用的页面,则很难离开。不幸的是,目前我无法减小有效负载的大小(我正在加载图形,有时图形有数十万个节点和边缘)。不间断ajax请求
任何想法为什么浏览器不会离开(即使浏览器响应)?如果可能,还有什么潜在的解决方案?谢谢!
我不知道如何解决您面临的确切技术问题。但是这仍然有用。考虑Google或Facebook,您可以将您的完整个人资料作为档案下载到您的所有历史记录和照片中。记下他们如何做(不通过AJAX调用)。我相信他们选择这种方式是因为你有同样的问题。只是想想。
几个月前我遇到过类似的问题。我找到了一个使用setTimeout()
的解决方案,它在浏览器事件队列中创建一个单独的事件。这基本上就是我所做的:
jQuery(document).ready(function() {
setTimeout(function() {
$.ajax({
url: "/longAjaxCall",
dataType: "json"
}).done(function() {
// do whatever ...
});
}, 0);
});
不知道您是否正在使用jQuery,但不管其基本原理是相同的。
我建议使用HTML5 Web Worker。浏览器支持不是很好,特别是对于IE。
Web工作人员是非阻塞的,这意味着您可以同时运行两个脚本。当你在后台进行AJAX调用时,这应该释放你的DOM。
Here is one article I could find on using web workers with an AJAX call.
我将首先发送一个MD5 sum
和chunk number
将数据分割成块。我会制作一个js
脚本,慢慢地问他们。然后加入它,稍后检查完整数据是否正确发送,并最终使用它。
我能想到的唯一两件事就是像上面提到的许多AJAX调用不是异步的,或者您可能已经用完了该浏览器可用的所有并行http连接线程。 AJAX调用阻止了一个,因此取决于您允许用户执行的其他交互,您可能只是在后台下载图像和脚本,并有效地阻止用户前进,直到任何一个完成。
20 MB确实是一大块,所以我也同意其他人的看法,也许你应该探索一些可能的方法来实现你所需要的东西。
你有没有想过把你的JSON分成几块?您也可以考虑通过类似BinaryJS的流式传输并使用允许“流式传输JSON”的扩展之一来访问解析的JSON对象的元素,并继续下载。 – Brad
你在使用同步ajax吗?如果是这样,**停止这样做**。 – Pointy
考虑: * JSON分块 *当数据大于X时打开一个单独的页面供上传* *上传为更具尺寸效率的格式? – Kroltan