El browser interrumpe las requestes de Ajax esporádicamente sin devolver ningún error

En mi proyecto ( PHP con Symfony 2) hago muchas requestes de Ajax en cada página. Tengo muchos problemas con ellos, porque parece que los browseres (probados en Google Chrome y Firefox ) están cancelando las requestes sin darme un error. He hecho una página limpia para probar qué puede estar causando este problema y el error persiste. Probé una testing haciendo 10 requestes dentro de un ciclo for (creo que no tenemos ningún problema con eso, ¿no?).

Aquí está mi código:

 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Test page</title> </head> <body>Test page. <script type="text/javascript" src="/js/compressed_jquery-1.8.2.min_1.js"></script> <script type="text/javascript"> $(document).ready(function() { for (var i = 0; i < 10; i++) { $.get('/i18n/javaScript/pt.json', function(data) { console.log(data); }); } }); </script> </body> </html> 

Y aquí hay una captura de pantalla de las requestes que resultan en Firebug :

Ajax solicita captura de pantalla

Como puede ver, algunas requestes se completan y otras no. En ocasiones, el browser completa las 10 requestes sin errores. ¿Qué puede estar causando esto?


He probado todas las soluciones, pero estoy bastante seguro de que se trata de un problema de configuration de Windows, Apache o PHP. Hoy he configurado una máquina virtual en mi máquina con VirtualBox corriendo Ubuntu 13.04 (Raring Ringtail) con Apache 2.2 + PHP, y NO ERROR sucedió, demostrando que no es nada con mi código JavaScript , HTML o PHP. No estoy seguro de que sea un problema de configuration. ¿Cómo descubro esta configuration?

Podría satisfacer sus necesidades, enviando la request una por una debería evitar que el server rechace algunas requestes paralelas:

PRUÉBALO

 $(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); }); 

Puede serializar requestes con un object global:

 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(); 

en tu código, hazlo

 requester.doRequest(yourRequest); 

Creo que su server tarda demasiado en responder y el browser está agotando el time. Es posible que el browser solo tenga dos conexiones abiertas al server y que se cancele el último 8/10 cuando las dos primeras tarden demasiado. Verificaría los loggings de su server para confirmar esto.

¿Qué está haciendo el server cuando ve una request a /i18n/javaScript/pt.json ? Cuatro segundos es mucho time. Intente search algún contenido estático como una image o algún HTML estático en lugar de pt.json y vea si eso soluciona el problema.

Si necesita hacer una gran cantidad de cálculos para producir pt.json , ¿se puede almacenar en caching? ¿Es muy grande? ¿Estás usando Apache?

Si esto es un problema de caching, puede intentar esto:

Agregue el siguiente marcado en el encabezado de su página. Eso evitará que el browser guarde en caching ningún dato.

 <meta http-equiv="cache-control" content="max-age=0" /> <meta http-equiv="cache-control" content="no-cache" /> <meta http-equiv="expires" content="0" /> <meta http-equiv="expires" content="Tue, 01 Jan 1990 12:00:00 GMT" /> 

Esto desactivará el almacenamiento en caching en la mayoría de los browseres, y sus datos se obtendrán en cada actualización ya que no hay memory caching.

Una cosa más. Sus datos se llaman en bucle … Puedo decir que es una llamada continua con la misma request, por lo que la request puede considerarse como una request duplicada y puede ser cancelada por el service; Como eso podría considerarse una avalancha de requestes si la misma request se envía una y otra vez …

Intenta agregar algo mientras llamas, así …

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

Y maneja la request con algo. Intenta ver si funciona …

Si llama a open () usando, como está usando, jQuery , está integrado, y tendrá un efecto.

Remitir un post antiguo de desbordamiento de stack ¿Cómo resolver los posts "abortados" de Firebug a petición de Ajax? .

Estoy seguro de que esto te dará una ventaja positiva hacia la solución …