Para agregar un manejo básico de errores, quería reescribir un fragmento de código que usaba $ .getJSON de jQuery para extraer algunas fotos de Flickr. La razón para hacer esto es que $ .getJSON no proporciona manejo de errores ni trabaja con tiempos de espera.
Como $ .getJSON es solo un envoltorio alrededor de $ .ajax, decidí reescribirlo y, sorpresa sorpresa, funciona perfectamente.
Ahora empieza la diversión. Cuando deliberadamente provoco un 404 (al cambiar la URL) o hago que la red se agote (al no estar conectado a las redes), el evento de error no se activa en absoluto. No sé qué estoy haciendo mal. Se agradece mucho la ayuda.
Aquí está el código:
$(document).ready(function(){
// var jsonFeed = "http://api.flickr.com/services/feeds/photos_public.gne"; // correct URL
var jsonFeed = "http://api.flickr.com/services/feeds/photos_public.gne_______"; // this should throw a 404
$.ajax({
url: jsonFeed,
data: { "lang" : "en-us",
"format" : "json",
"tags" : "sunset"
},
dataType: "jsonp",
jsonp: "jsoncallback",
timeout: 5000,
success: function(data, status){
$.each(data.items, function(i,item){
$("<img>").attr("src", (item.media.m).replace("_m.","_s."))
.attr("alt", item.title)
.appendTo("ul#flickr")
.wrap("<li><a href=\"" + item.link + "\"></a></li>");
if (i == 9) return false;
});
},
error: function(XHR, textStatus, errorThrown){
alert("ERREUR: " + textStatus);
alert("ERREUR: " + errorThrown);
}
});
});
Me gustaría agregar que esta pregunta se hizo cuando jQuery estaba en la versión 1.4.2
<script>
etiquetas Javascript que se insertan dinámicamente. Por lo tanto, lo único que puede saber es que una solicitud falló, no cuál era el código de estado. Si desea obtener códigos de estado, debe utilizar solicitudes Ajax tradicionales u otras técnicas de dominio cruzado.Esta es una limitación conocida con la implementación nativa de jsonp en jQuery. El texto a continuación es de IBM DeveloperWorks
Sin embargo, hay un complemento jsonp disponible en GoogleCode que brinda soporte para el manejo de errores. Para comenzar, simplemente realice los siguientes cambios en su código.
Puede descargarlo o simplemente agregar una referencia de script al complemento.
Luego modifique su llamada ajax como se muestra a continuación:
fuente
Una solución si está atascado con jQuery 1.4:
fuente
.abort()
a un jqXHR pendiente después de un período de tiempo de espera podría ser una mejor manera.Esta puede ser una limitación "conocida" de jQuery; sin embargo, no parece estar bien documentado. Pasé aproximadamente 4 horas hoy tratando de entender por qué mi tiempo de espera no estaba funcionando.
Cambié a jquery.jsonp y funcionó como un encanto. Gracias.
fuente
Parece estar resuelto a partir de jQuery 1.5. Probé el código anterior y recibo la devolución de llamada.
Digo "parece ser" porque la documentación de la devolución de llamada de error para jQuery.ajax () todavía tiene la siguiente nota:
fuente
El complemento jquery-jsonp jQuery mencionado en la respuesta de Jose Basilio ahora se puede encontrar en GitHub .
Desafortunadamente, la documentación es algo espartana, por lo que he proporcionado un ejemplo simple:
Importante Incluya el parámetro callbackParameter en la llamada $ .jsonp () de lo contrario, descubrí que la función de devolución de llamada nunca se inyecta en la cadena de consulta de la llamada de servicio (actual a partir de la versión 2.4.0 de jquery-jsonp).
Sé que esta pregunta es antigua, pero el problema del manejo de errores usando JSONP aún no está 'resuelto'. Con suerte, esta actualización ayudará a otros, ya que esta pregunta es la mejor clasificada dentro de Google para "manejo de errores jquery jsonp".
fuente
¿Qué hay de escuchar el evento de error del guión? Tuve este problema y lo resolví parcheando el método de jquery donde se creó la etiqueta de script. Aquí está el código interesante:
¿Qué opinas de esta solución? ¿Es probable que cause problemas de compatibilidad?
fuente