Para adicionar algum tratamento básico de erro, eu queria reescrever um trecho de código que usava $ .getJSON do jQuery para puxar algumas fotos do Flickr. O motivo para fazer isso é que $ .getJSON não fornece tratamento de erros ou trabalha com tempos limite.
Já que $ .getJSON é apenas um invólucro em torno de $ .ajax, decidi reescrever a coisa e surpresa surpresa, funciona perfeitamente.
Agora a diversão começa. Quando eu deliberadamente causo um 404 (alterando a URL) ou faço a rede atingir o tempo limite (por não estar conectada às interwebs), o evento de erro não dispara. Não sei o que estou fazendo de errado. A ajuda é muito apreciada.
Aqui está o 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);
}
});
});
Eu gostaria de acrescentar que esta pergunta foi feita quando o jQuery estava na versão 1.4.2
<script>
tags Javascript inseridas dinamicamente. Portanto, a única coisa que você pode saber é que uma solicitação falhou, não qual era o código de status. Se quiser obter códigos de status, você precisa usar solicitações Ajax tradicionais ou outras técnicas de domínio cruzado.Esta é uma limitação conhecida com a implementação jsonp nativa em jQuery. O texto abaixo é do IBM DeveloperWorks
No entanto, há um plug-in jsonp disponível no GoogleCode que fornece suporte para tratamento de erros. Para começar, basta fazer as seguintes alterações em seu código.
Você pode baixá-lo ou apenas adicionar uma referência de script ao plug-in.
Em seguida, modifique sua chamada ajax conforme mostrado abaixo:
fonte
Uma solução se você estiver preso ao jQuery 1.4:
fonte
.abort()
um jqXHR pendente após um período de tempo limite pode ser uma maneira melhor.Esta pode ser uma limitação "conhecida" do jQuery; entretanto, não parece estar bem documentado. Passei cerca de 4 horas hoje tentando entender por que meu tempo limite não estava funcionando.
Mudei para jquery.jsonp e funcionou como um encanto. Obrigado.
fonte
Parece estar resolvido a partir do jQuery 1.5. Tentei o código acima e recebo o retorno de chamada.
Digo "parece ser" porque a documentação do retorno de chamada de erro para jQuery.ajax () ainda tem a seguinte observação:
fonte
O plugin jquery-jsonp jQuery mencionado na resposta de Jose Basilio agora pode ser encontrado no GitHub .
Infelizmente, a documentação é um tanto espartana, então forneci um exemplo simples:
Importante Inclua o callbackParameter na chamada $ .jsonp (), caso contrário, descobri que a função de retorno de chamada nunca é injetada na string de consulta da chamada de serviço (atual a partir da versão 2.4.0 de jquery-jsonp).
Eu sei que esta questão é antiga, mas o problema de tratamento de erros usando JSONP ainda não foi 'resolvido'. Esperamos que esta atualização ajude outras pessoas, pois esta questão é a melhor classificada no Google em "tratamento de erros jquery jsonp".
fonte
Que tal ouvir o evento onerror do script? Eu tive esse problema e resolvi corrigindo o método jquery onde a tag de script foi criada. Aqui está a parte interessante do código:
O que você acha desta solução? É provável que cause problemas de compatibilidade?
fonte