这在检索php数据时非常有效,比如15次通过,但当json文件是100个项目时,它会阻塞php脚本并产生随机错误。我的猜测是,因为请求都是从这个单一的ajax请求中发出的(比php脚本的工作速度更快),php脚本会感到困惑吗?
$(document).ready(function(){
var ajax_load = "<div class='loadwrap'><img class='load' src='/img/load.gif' style='width:12px;' alt='' /> fetching list...</div>";
$("#status").html(ajax_load);
$.getJSON('/fsbo/get_urls_24_hours', function(data) {
$("#alias").fadeOut('slow');
var ajax_load = "<div class='loadwrap'><img class='load' src='/img/load.gif' style='width:12px;' alt='' /> fetching property...</div>";
$('#props').html('');
$.each(data, function(key, val) {
$.ajax({
type: "POST",
url: base_url + "/fsbo/get_property",
data: "url="+ val,
cache:false,
success:
function(data){
$("<div></div>").html(data).appendTo('#props');
}
});
});
});
});
作为旁注,我应该把隐藏加载gif放在哪里?把它放在循环的末尾没有好处——它只是打开和关闭,而不等待数据的返回。
在循环中发出AJAX请求通常是个坏主意。为什么不修改原始调用以返回JSON中所需的所有数据,而不是进行100次调用呢。
如果由于某种原因无法避免这种情况,请限制挂起请求的数量。例如,发送前5个请求,然后在收到前5个中的一个请求的响应后才发送第6个请求。这样,任何时候只有5个请求处于挂起状态,并且您的服务器不会同时收到100个请求。
这个被剪切的代码是致命的。
$.each(data, function(key, val) {
$.ajax({
如果data
的长度为100,则将有100个http连接到您的服务器。这显然会阻塞您的服务器。此外,你的浏览器会变慢。这就像在Firefox中一次打开100个标签。
通过一个Ajax请求传递所有数据。如果大小巨大,则逐块发送。当您收到第一个响应时,发送下一个区块的请求。但不要同时发送。
我确实认为你有正确的答案,这是因为这个调用。
PHP调用的工作方式是创建对系统的单独调用,同时调用各种其他库,从而调用某种内存泄漏,这会成倍地增加所需的时间和资源。
我的建议是,将所有变量传递给PHP,让它完成工作,然后接收一个JSON对象,并对其进行解析
对于最终用户来说,它可能会慢一点,但应该有助于避免这种情况的发生。
p.S.
我也遇到过类似的问题,当这种调用为一个用户发出如此多的请求时,整个Web服务器都崩溃了。