2009-11-16 5 views
165

Comment pouvez-vous gérer les erreurs dans un appel getJSON? En essayant de référencer un service de script interdomaines en utilisant jsonp, comment enregistrer une méthode d'erreur?Gestion des erreurs dans les appels getJSON

+0

Semble être une copie de ** [Comment puis-je attraper jQuery $ .getJSON (ou $ .ajax avec le type de données mis à 'jsonp') erreur lors de l'utilisation de JSONP? ] (http://stackoverflow.com/questions/309953/how-do-i-catch-jquery-getjson-or-ajax-with-datatype-set-to-jsonp-error-w) ** – hippietrail

+0

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

+0

@ IonicăBizău Marqué maintenant. Je viens de perdre la trace de cela pendant un moment. La meilleure réponse ne parle pas de JSONP. Comme indiqué par Ben Shelock, il n'y a pas de gestionnaire d'erreur pris en charge est ce que je crois .. – Ajay

Répondre

7

Il semble qu'il n'y ait pas de méthode d'erreur d'après ce que j'ai lu here. This answer offre une bonne explication

256

$.getJSON() est une sorte d'abstraction d'un appel AJAX régulier où vous devez dire que vous voulez une réponse codée JSON.

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

Vous pouvez gérer les erreurs de deux façons: génériquement (en configurant votre AJAX appels avant de les appeler en fait) ou spécifiquement (avec chaîne de méthode).

'générique' serait quelque chose comme:

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

Et la manière 'spécifique':

$.getJSON("example.json", function() { 
    alert("success"); 
}) 
.success(function() { alert("second success"); }) 
.error(function() { alert("error"); }) 
.complete(function() { alert("complete"); }); 
+0

si vous utilisez le .error() devez-vous utiliser les deux autres? –

+0

Nops! Tu peux y aller comme tu veux.Jetez un oeil à la docs pour une aide plus détaillée: [http://api.jquery.com/jQuery.ajax](http://api.jquery.com/jQuery.ajax) –

+4

Notez que cela nécessite jQuery 1.5+ (essayait de le faire fonctionner avec jQuery 1.3 et se demandait pourquoi il se plaignait de la méthode invalide :-) – kenyee

77

Quelqu'un donne Luciano ces points :) Je viens de tester sa réponse -had un semblable question- et a parfaitement fonctionné ...

J'ajoute même mes 50 cents:

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

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

+24

Bonne réponse! Juste une note sur .error: Il désapprouver dans jQuery 1.8, donc utilisez [.fail] (http://api.jquery.com/jQuery.ajax/) –

+2

Cela a sauvé ma vie – KJP

1

J'ai été confronté au même problème, mais plutôt que de créer des rappels pour une demande ayant échoué, j'ai simplement renvoyé une erreur avec l'objet de données json.

Si possible, cela semble être la solution la plus simple. Voici un exemple du code Python que j'ai utilisé. (L'utilisation Flask, jsonify f et SQLAlchemy de Flask)

try: 
    snip = Snip.query.filter_by(user_id=current_user.get_id(), id=snip_id).first() 
    db.session.delete(snip) 
    db.session.commit() 
    return jsonify(success=True) 
except Exception, e: 
    logging.debug(e) 
    return jsonify(error="Sorry, we couldn't delete that clip.") 

Ensuite, vous pouvez vérifier Javascript comme celui-ci;

$.getJSON('/ajax/deleteSnip/' + data_id, 
    function(data){ 
    console.log(data); 
    if (data.success === true) { 
     console.log("successfully deleted snip"); 
     $('.snippet[data-id="' + data_id + '"]').slideUp(); 
    } 
    else { 
     //only shows if the data object was returned 
    } 
}); 
+0

Cela est bien pour les erreurs qui se produisent dans le serveur, mais il ne capture pas lorsque l'appel ne peut pas atteindre le serveur ou si une erreur est renvoyée avant qu'il ne frappe le code du serveur, par exemple si un utilisateur MVC n'est plus authentifié. –

54

Voici mon ajout.

De http://www.learnjavascript.co.uk/jq/reference/ajax/getjson.html et the official source

"Le jqXHR.success(), jqXHR.error() et() jqXHR.complete méthodes de rappel introduites dans jQuery 1.5 sont OBSOLETE jQuery 1.8. Pour préparer votre code pour leur suppression éventuelle, utilisez jqXHR.done(), jqXHR.fail() et jqXHR.always() au lieu "

Je l'ai fait et voici l'extrait de code mis à jour de 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 d'erreur ainsi que montrant toutes les données JSON sous forme de 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 ne souhaitez pas d'alertes, les remplacer 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

Quel est l'ordre chronologique de done, fail, always et le code dans getJSON? – TheLogicGuy

+0

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

9

Je sais que ça fait un moment que Quelqu'un a répondu ici et l'affiche a probablement déjà sa réponse soit d'ici ou d'ailleurs.Je pense cependant que ce post aidera tous ceux qui cherchent un moyen de garder une trace des erreurs et des délais d'attente lors des requêtes getJSON. Par conséquent ci-dessous ma réponse à la question

La structure getJSON est la suivante (qui se trouve sur http://api.jqueri.com):

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

la plupart des gens à mettre en œuvre que l'utilisation

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

où ils utilisent le var url pour fournir un lien vers les données JSON, le datatosend comme un endroit pour ajouter le "?callback=?" et d'autres variables qui doivent être envoyées pour obtenir les bonnes données JSON retournées, et la fonction de succès comme une fonction pour le traitement des données.

Vous pouvez toutefois ajouter l'état et les variables xhr dans votre fonction de réussite. La variable d'état contient l'une des chaînes suivantes: "succès", "notmodified", "erreur", "délai d'attente", ou "parsererror", et la variable XHR contient l'objet XMLHttpRequest retourné (found on 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 garder une trace des dépassements de délai et des erreurs sans avoir à implémenter un outil de suivi de délai d'attente personnalisé qui est démarré une fois qu'une demande est effectuée.

Espérons que cela aide quelqu'un qui cherche toujours une réponse à cette question.

+2

Cela ne fonctionne pas. Le callback "succès", comme son nom l'indique, est seulement appelé en cas de succès. (Donc je ne suis pas sûr de ce que le paramètre "status" est pour ...) – jwelsh

0

Dans certains cas, vous pouvez rencontrer un problème de synchronisation avec cette méthode. Je écrit l'appel de rappel dans une fonction setTimeout, et cela a fonctionné très bien = synchroniquement)

par exemple:

function obterJson(callback) { 


    jqxhr = $.getJSON(window.location.href + "js/data.json", function(data) { 

    setTimeout(function(){ 
     callback(data); 
    },0); 
} 
1

Pourquoi ne pas

getJSON('get.php',{cmd:"1", typeID:$('#typesSelect')},function(data) { 
    // ... 
}); 

function getJSON(url,params,callback) { 
    return $.getJSON(url,params,callback) 
     .fail(function(jqXMLHttpRequest,textStatus,errorThrown) { 
      console.dir(jqXMLHttpRequest); 
      alert('Ajax data request failed: "'+textStatus+':'+errorThrown+'" - see javascript console for details.'); 
     }) 
} 

??

Pour plus de détails sur la méthode utilisée .fail() (jQuery 1.5+), voir http://api.jquery.com/jQuery.ajax/#jqXHR

Depuis le jqXHR est retourné par la fonction, un enchaînement comme

$.when(getJSON(...)).then(function() { ... }); 

est possible.

0

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

Il est fixé dans jQuery 2.x; Dans jQuery 1.x vous n'obtiendrez jamais un rappel d'erreur