A partir de jQuery 1.5, los métodos ajax ahora manejan correctamente 304 respuestas no modificadas llamando al controlador success(), según las especificaciones W3C para XMLHTTPRequest. Esto permite que su aplicación trate la solicitud como exitosa, incluso si el servidor no devolvió ningún dato (porque ya tiene los últimos datos almacenados en caché).Manera correcta de manipular 304 no modificada en jQuery ajax
Para una normal (sin caché) petición GET, el manejador de éxito se llama con los siguientes argumentos:
- datos: {los datos del servidor}
- estado: OK
- jqXHR:
- estado: 200
- statusText: OK
- responseText: {los datos del servidor}
Para una petición GET en caché, el controlador de éxito se llama con los siguientes argumentos:
- datos: indefinido estado
- : notmodified
- jqXHR:
- estado : 304
- statusText: no modificado
- responseText: {los datos de la caché}
(al menos, esta es la forma en que se devuelve en IOS 4.2, para una aplicación Web que utiliza el caché de la aplicación a través de un archivo de manifiesto. Supongo que esto es coherente para el almacenamiento en caché general del navegador en la mayoría de las plataformas/navegadores).
Puede ver que el argumento "datos" solo se rellena si la solicitud fue 200 correcta; donde como jqXHR.responseText siempre se rellena con datos, independientemente de si esos datos provienen del servidor (200 OK) o de la caché (304 Not Modified).
Dado que, en la mayoría de las solicitudes GET, su controlador de éxito va a querer hacer algo con los datos que obtuvo independientemente de su procedencia, parece que lo más lógico para su código de éxito es utilizar siempre jqXHR.responseText, en lugar de hacer algo como esto:
if ("notmodified" === status) {
// do something with jqXHR.responseText
} else {
// do something with data
}
O hay alguna vez un caso cuando jqXHR.responseText no estaría poblada en el manejador de éxito, pero los datos arg sería?
Tengo que pasar por mi base de código y cambiar todos los manejadores de éxito (anteriormente estaba en jQuery 1.4.2, que siempre devolvía datos, incluso desde la caché); así que solo quiero asegurarme de que lo estoy manejando de la manera correcta. (No quiero llegar al final y luego darse cuenta de que debería haberlo hecho de otra manera).
Actualmente estoy lidiando con este problema en un proyecto ... algo sorprendente que jQuery no rellene automáticamente el parámetro de datos por usted. No estoy de acuerdo con su lógica ... Estoy bastante seguro de que el estándar HTTP requiere un cuerpo de respuesta vacío para 304 respuestas no modificadas, por lo que el servidor no debe enviar datos adicionales ... no debería haber cualquier ambigüedad –
En mi caso, jqXHR.responseText no está definido con un texto de respuesta también :( – drogon