浏览器偶尔中止Ajax请求而不返回任何错误

在我的项目中( PHP与Symfony 2)我在每个页面中都做了很多Ajax请求。 我遇到了很多问题,因为它看起来像浏览器(在谷歌浏览器和Firefox中测试)正在中止请求而不会给我一个错误。 我已经做了一个干净的页面来测试可能导致此问题的原因并且错误仍然存​​在。 我试过在for循环中做10个请求的测试(我相信我们没有任何问题,对吧?)。

这是我的代码:

     Test page  Test page.   $(document).ready(function() { for (var i = 0; i < 10; i++) { $.get('/i18n/javaScript/pt.json', function(data) { console.log(data); }); } });    

以下是Firebug中请求结果的屏幕截图:

Ajax请求截图

如您所见,某些请求已完成,而其他请求未完成。 有时浏览器会完成所有10个请求而不会出错。 是什么导致这个?


我已经测试了所有解决方案,但我很确定它是Windows,Apache或PHP配置问题。 今天我在我的机器中配置了一个VM , VirtualBox运行Ubuntu 13.04 (Raring Ringtail)和Apache 2.2 + PHP,并且没有错误发生,certificate这与我的JavaScript , HTML或PHP代码无关。 我不确定这是配置问题。 我如何发现此配置?

可以满足您的需求,逐个发送请求应避免服务器拒绝某些并行请求:

测试它

 $(document).ready(function () { var tot = 30; //to simulate 30 requests (function request(i){ if(i === tot) return; $.get('/echo/html/?'+i, function (data) { console.log("success"); }).always(function() { request(++i) }); })(0); }); 

您可以使用全局对象序列化请求:

 function AjaxRequester() { this.queue = []; } AjaxRequester.prototype.doRequest(request){ if (this.queue.length>0){ this.queue.push(request) } else handleRequest(request) } AjaxRequester.prototype.handleRequest(request){ /* actually handle ajax request, on complete inspect queue and if not empty recall this method on the first element */ } requester = new AjaxRequester(); 

进入你的代码,做

 requester.doRequest(yourRequest); 

我认为您的服务器响应时间过长,浏览器超时。 可能是浏览器只有两个到服务器的开放连接,并且当前两个花费太长时间时中止最后8/10。 我会检查你的服务器日志以确认这一点。

当服务器看到对/i18n/javaScript/pt.json的请求时,它在做什么? 四秒钟很长一段时间。 尝试获取一些静态内容,如图像或一些静态HTML而不是pt.json ,看看是否能解决问题。

如果你需要做很多计算来生成pt.json ,它可以被缓存吗? 它非常大吗? 你在使用Apache吗?

如果这是一个缓存问题,那么您可以尝试这样做:

在页面标题中添加以下标记。 这将阻止浏览器缓存任何数据。

     

这将禁用大多数浏览器中的缓存,并且由于没有缓存,因此将在每次刷新时获取数据,

还有一件事。 您的数据在循环中被调用…我可以说它是具有相同请求的连续调用,因此该请求可能被视为重复请求,并且可能被服务取消; 如果一次又一次地发送相同的请求,那么可能会被视为大量请求……

尝试在调用时添加一些东西,像这样..

 for (var i = 0; i < 10; i++) { $.get('/i18n/javaScript/pt.json?v='+i, function(data) { console.log(data); }); } 

并用一些东西处理请求。 试试看它是否有效..

如果你正在使用jQuery调用open(),它就是内置的,它会有效果。

请参阅Stack Overflow Old Post 如何在Ajax请求时解决Firebug的“Aborted”消息?

我相信这会给你带来积极的解决方案......