213 votes

Gestion des erreurs dans les appels getJSON

Comment gérer les erreurs dans un appel getJSON ? J'essaie de référencer un service script inter-domaine en utilisant jsonp, comment enregistrer une méthode d'erreur ?

0 votes

Ajay, pourquoi ne pas envisager de marquer la bonne réponse ?

0 votes

@IonicaBizau Marqué maintenant. J'ai perdu la trace de ce sujet pendant un moment. La première réponse ne parle pas de JSONP. Comme l'a souligné Ben Shelock, il n'y a pas de gestionnaire d'erreur supporté, c'est ce que je crois

294voto

Luciano Costa Points 1761

$.getJSON() est une sorte d'abstraction d'un appel AJAX normal où vous devriez indiquer que vous voulez une réponse codée en JSON.

$.ajax({
  url: url,
  dataType: 'json',
  data: data,
  success: callback
});

Vous pouvez gérer les erreurs de deux façons : de manière générique (en configurant vos appels AJAX avant de les appeler réellement) ou de manière spécifique (avec la chaîne de méthodes).

générique " serait quelque chose comme :

$.ajaxSetup({
      "error":function() { alert("error");  }
});

Et la manière "spécifique" :

$.getJSON("example.json", function() {
  alert("success");
})
.done(function() { alert("second success"); })
.fail(function() { alert("error"); })
.always(function() { alert("complete"); });

0 votes

Nops ! Vous pouvez y aller comme bon vous semble. Jetez un coup d'œil à la documentation pour une aide plus détaillée : http://api.jquery.com/jQuery.ajax

5 votes

Notez que cela nécessite jQuery 1.5+ (j'essayais de le faire fonctionner avec jQuery 1.3 et je me demandais pourquoi il se plaignait d'une méthode invalide :-)

24 votes

L'OP pose une question spécifique sur le cross-site JSONP à ce qu'il semble getJSON dans ce cas, n'appelle pas le error() fonction. J'ai le même problème. Je suppose que c'est lié à la façon dont JSONP est traitée de manière totalement différente de la normale AJAX Les appels jQuery malgré getJSON la gestion des deux. JSON se fait avec un XMLHTTPRequest objet mais JSONP se fait en ajoutant dynamiquement un <script> à la balise HEAD .

89voto

frenetix Points 600

Que quelqu'un donne ces points à Luciano :) Je viens de tester sa réponse -j'avais une question similaire- et ça a parfaitement fonctionné...

J'ajoute même mes 50 centimes :

.error(function(jqXHR, textStatus, errorThrown) {
        console.log("error " + textStatus);
        console.log("incoming Text " + jqXHR.responseText);
    })

3 votes

Était-ce avec le JSONP intersite ou avec le JSON du même site ?

30 votes

Bonne réponse ! Juste une note à propos de .error : Il sera déprécié dans jQuery 1.8, donc utiliser .fail

82voto

user2314737 Points 1671

Voici mon ajout.

De http://www.learnjavascript.co.uk/jq/reference/ajax/getjson.html y la source officielle

" Les méthodes de rappel jqXHR.success(), jqXHR.error() et jqXHR.complete() ont été introduites dans le système. introduites dans jQuery 1.5 sont obsolètes depuis jQuery 1.8. Pour préparer votre code à leur suppression éventuelle, utilisez jqXHR.done(), jqXHR.fail(), et jqXHR.always() à la place. "

Je l'ai fait et voici l'extrait de code mis à jour par Luciano :

$.getJSON("example.json", function() {
  alert("success");
})
.done(function() { alert('getJSON request succeeded!'); })
.fail(function() { alert('getJSON request failed! '); })
.always(function() { alert('getJSON request ended!'); });

Et avec la description de l'erreur plus l'affichage de toutes les données json comme une chaîne :

$.getJSON("example.json", function(data) {
  alert(JSON.stringify(data));
})
.done(function() { alert('getJSON request succeeded!'); })
.fail(function(jqXHR, textStatus, errorThrown) { alert('getJSON request failed! ' + textStatus); })
.always(function() { alert('getJSON request ended!'); });

Si vous n'aimez pas les alertes, remplacez-les par console.log

$.getJSON("example.json", function(data) {
  console.log(JSON.stringify(data));
})
.done(function() { console.log('getJSON request succeeded!'); })
.fail(function(jqXHR, textStatus, errorThrown) { console.log('getJSON request failed! ' + textStatus); })
.always(function() { console.log('getJSON request ended!'); });

0 votes

Quel est l'ordre chronologique de "done", "fail", "always" et du code dans "getJSON" ?

0 votes

Note : console.log n'est pas implémenté dans les anciens navigateurs comme IE7 ! Juste au cas où vous l'utiliseriez !

12voto

Tom Groentjes Points 119

Je sais que cela fait un moment que quelqu'un n'a pas répondu ici et que l'auteur de la question a probablement déjà obtenu sa réponse ici ou ailleurs. Je pense cependant que ce post aidera tous ceux qui cherchent un moyen de garder une trace des erreurs et des timeouts lors des requêtes getJSON. Par conséquent, voici ma réponse à la question

La structure de getJSON est la suivante (trouvée sur http://api.jqueri.com ) :

$(selector).getJSON(url,data,success(data,status,xhr))

la plupart des gens le mettent en œuvre en utilisant

$.getJSON(url, datatosend, function(data){
    //do something with the data
});

où l'on utilise la variable url pour fournir un lien vers les données JSON, la variable datatosend pour ajouter la balise "?callback=?" et d'autres variables qui doivent être envoyées pour obtenir le retour de données JSON correctes, et la fonction de réussite comme fonction de traitement des données.

Vous pouvez toutefois ajouter les variables status et xhr dans votre fonction de réussite. La variable status contient l'une des chaînes suivantes : "success", "notmodified", "error", "timeout", ou "parsererror", et la variable xhr contient l'objet XMLHttpRequest renvoyé ( trouvé sur w3schools )

$.getJSON(url, datatosend, function(data, status, xhr){
    if (status == "success"){
        //do something with the data
    }else if (status == "timeout"){
        alert("Something is wrong with the connection");
    }else if (status == "error" || status == "parsererror" ){
        alert("An error occured");
    }else{
        alert("datatosend did not change");
    }         
});

De cette façon, il est facile de suivre les délais d'attente et les erreurs sans avoir à mettre en œuvre un suivi personnalisé des délais d'attente qui est lancé dès qu'une demande est effectuée.

J'espère que cela aidera quelqu'un qui cherche encore une réponse à cette question.

2 votes

Cela ne fonctionne pas. Le callback "success", comme son nom l'indique, n'est appelé qu'en cas de succès. (Donc je ne suis pas sûr de savoir à quoi sert le paramètre "status"...)

9voto

Ben Shelock Points 4405

Il semble qu'il n'y ait pas de méthode d'erreur d'après ce que j'ai lu. aquí . Cette réponse offre une bonne explication

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X