2010-09-01 17 views
9

Hola me di cuenta de que este simple código no funciona de la manera que se supone que funciona ...

function test() { 
    $.ajax({ 
     'url' : 'test/GameConfiguration.json', 
     'dataType' : 'json', 
     data : { 
      a : 'aaa' 
     }, 
     cache : false, 
     method : 'get', 
     timeout : 10000, //10 secs of timeout 
     success : function(data, textStatus, XMLHttpRequest) { 
      console.log("success"); 
      if (data == null) 
       console.log("it's not a real success"); 
     }, 
     error : function(XMLHttpRequest, textStatus, errorThrown) { 
      console.log("error: " + textStatus); 
     } 
    }); 
} 

La prueba se ha ejecutado en el servidor local, Quiero decir: cargué la página, apagué el servidor web local, luego abrí la solicitud (mediante un simple botón con un clic apuntando a esta función). Nunca se llama al error, lo que obtengo es que se llame al controlador de éxito y tiene textStatus = "success" y data = null. Incluso me doy cuenta de que la solicitud expira mucho antes de los 10 segundos. Esto sucede en Firefox (última versión), Chrome (última versión) y Safari 5. ¿Por qué esto? ¿Es por el hecho de que estoy trabajando en localhost?


Me olvidé de decir: LA Solicitud no está en la memoria caché. De hecho, las herramientas Firebug y Chrome dev muestran que la solicitud falla.


gran actualización

Este comportamiento está relacionado con el uso de localhost. De hecho, si cargo esta página desde otra PC de un colega y antes de activar la solicitud, desconecto mi PC de la red, obtengo correctamente el controlador de errores disparado con tiempo de espera como estado. Creo que esto es un error de jQuery. Se me hará difícil de probar los errores de tiempo de espera :(


chicos de foros jQuery dicen que esto se debe a la forma en la pila de red se interrumpe la conexión, dado que el anfitrión es localhost. He probado esto en Windows 7 Sólo Si tienes ganas de probar esto en otros sistemas y se puede trabajar algunos detalles internos de jQuery, informe a este post en los foros de jQuery:.

http://forum.jquery.com/topic/strange-and-unexpected-behaviour-of-ajax-error-and-localhost#14737000001331961

+2

¿Por qué tienes ' '' y' url'' dataType'' citados como cadenas? – Codesleuth

+0

Intenté eliminar las cotizaciones: ninguna diferencia – gotch4

+0

¿Puedes mostrar una página de demostración para esto? – Nalum

Respuesta

7

ACTUALIZADO: Trate de sustituir la prueba (data == null) a la (XMLHttpRequest.readyState === 4 && XMLHttpRequest.status === 0).

En W3C Candidato Recomendación acerca de XMLHttpRequest estándar se describe que debe existir llamado "indicador de error" que se debe utilizar para indicar algún tipo de error de red o aborto. En el caso de este tipo de errores, el estado en el XMLHttpRequest será 0 en lugar de 200 ("OK"), 201 ("Creado"), 304 ("No modificado") y así sucesivamente. Para que corresponda exactamente a http://www.w3.org/TR/XMLHttpRequest/#the-status-attribute, XMLHttpRequest.status puede ser 0 en el caso de XMLHttpRequest.readyState igual a 0 o 1 ("UNSENT" o "OPENED"). Otro caso es XMLHttpRequest.readyState igual a 4 ("HECHO") y "indicador de error" es verdadero. Si no tenemos ninguno de estos dos casos, el XMLHttpRequest.status debe ser un código de estado HTTP. Bajo http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html o http://www.w3.org/Protocols/HTTP/1.0/spec.html#Status-Codes No hay código de estado HTTP igual a 0. Por lo que parece a mi que se puede hacer después de

jQuery(document).ready(function() { 
    $.ajax({ 
     type: 'GET', 
     url: 'test/GameConfiguration.json', 
     dataType: 'json', 
     cache : false, 
     success: function(data, textStatus, xhr){ 
      if (xhr.readyState === 4 && xhr.status === 0) { 
       // if readyState is DONE (numeric value 4) then corresponds to 
       // http://www.w3.org/TR/XMLHttpRequest/#dom-xmlhttprequest-done 
       // "The DONE state has an associated error flag that indicates 
       // some type of network error or abortion." 
       // Corresponds to http://www.w3.org/TR/XMLHttpRequest/#the-status-attribute 
       // If error flag it true, xhr.status is 0. 
       alert('"error flag\" is true. It means that we have a network error"+ 
         " or abortion (for example because of Same Origin Policy restrictions)'); 
      } 
      else { 
       alert(textStatus); 
       alert(data); 
      } 
     }, 
     error: function(xhr, textStatus, errorThrown) { 
      if (textStatus !== null) { 
       alert("error: " + textStatus); 
      } else if (errorThrown !== null) { 
       alert("exception: " + errorThrown.message); 
      } 
      else { 
       alert ("error"); 
      } 
     } 
    }); 
}); 
+0

Gracias, esto suena más robusto. De todos modos, publiqué todo esto en los foros de jQuery y algunos desarrolladores comenzaron a preocuparse por esto. Incluso envié algunos registros de depuración y probablemente esto se solucionará. – gotch4

+0

@ gotch4: No pude encontrar su publicación en los informes de errores de jQuery. ¿Podrías publicar la referencia? Encontré algunos otros informes cercanos como http://dev.jquery.com/ticket/6060. Parece que el cambio http://dev.jquery.com/changeset/6432 que intenta hacer una solución temporal para Opera estaba mal implementado y funciona mal ahora en caso de que XMLHttpRequest.status = 0 en otros navegadores. Si no haces esto Te recomiendo que insertes en tu informe de errores la referencia http://www.w3.org/TR/XMLHttpRequest/#the-status-attribute. El código de jQuery debería al menos seguir estándares y luego tratar de implementar cualquier solución. – Oleg

-2

Incluso si apaga el servidor local, que aún debe poder ver el archivo json ... intentar eliminar el archivo temporalmente y ver si funciona.

+0

Si elimino el archivo y el servidor está activado, por supuesto obtengo un 404 y el controlador de errores se desencadena. Si elimino el archivo y el servidor está DESACTIVADO, el mismo resultado. – gotch4

1

Si hay un error de red, se llamará a la devolución de llamada success y no al error, incluso si no tiene mucho sentido. Checkout this blog post para más detalles. Entonces, básicamente, lo que ha hecho al marcar data == null es correcto.

+0

Mire mis ejemplos de respuesta y código. ¿Cómo interpretas los resultados? ¿Crees que tenemos un error en jQuery? – Oleg

+0

No, su prueba es incorrecta: está cambiando el número de puerto. Esto no está permitido debido a las restricciones de la Política de origen idéntico: http://en.wikipedia.org/wiki/Same_origin_policy. No puede realizar consultas AJAX si cambia el número de puerto. –

+0

Tiene razón, mi primer ejemplo debe interpretarse como el mismo error de "Restricciones de política de origen". Escribo una nueva versión del código basado en http://www.w3.org/TR/XMLHttpRequest, que me parece que puede detectar un error en ambos casos: "Restricciones de la política de origen" o cualquier tipo de error en la red. En todos estos casos, la llamada del controlador de "éxito" debe interpretarse como un error. ¿Qué piensas de esta sugerencia? – Oleg