2010-09-04 6 views
33

J'ai besoin de quelques suggestions ici ou peut-être quelques explications. J'ai un appel ajax jquery,Jquery ajax callback d'erreur

$.ajax({ 
type: "GET", 
url: base_url+'/ajax/fetch/counts/', 
dataType: 'json', 
data: {}, 
error: function(xhr, error){ 
     console.debug(xhr); console.debug(error); 
}, 
success: display_counts 
}); 

Cela fonctionne bien. Mon rappel success se déclenche correctement avec la réponse. Mais, ce que je remarque est que mon rappel error est tiré à chaque fois, même quand mon appel retourne le statut de succès 200. Dans le rappel error ci-dessus, je vois cet objet xhr.status est 200.

Quelqu'un peut-il expliquer ce qui ne va pas, ou quoi se passe-t-il ici? error callback est censé se déclencher seulement quand j'ai 404 ou peut-être une réponse non-200. Mes hypothèses sont-elles correctes?

Merci.

Répondre

24

rappel d'erreur est appelée sur les erreurs http, mais aussi si l'analyse syntaxique JSON sur la réponse échoue. C'est ce qui se passe probablement si le code de réponse est 200, mais vous êtes toujours renvoyé au rappel d'erreur.

+2

Si vous attendez une réponse non JSON. Vous pouvez définir l'option dataType sur script/text ... etc Checkout http://api.jquery.com/jQuery.ajax et regarder sous dataFilter pour plus d'informations. – thekindofme

+0

J'appelais un script cgi, j'en avais besoin pour vider les données au format json. Il retournait une chaîne qui a échoué. – NuclearPeon

1

Un recent question avait un problème similaire avec json demandes jquery, essayez de supprimer autour () de votre réponse JSON.

+0

drôle, j'ai eu un problème similaire qui a été fixé par * ajoutant * crochets entourant. –

+0

@Coronatus Oui, ce que j'avais l'habitude de faire, mais jquery 1.4.2 commence à s'appuyer sur JSON.parse du navigateur, JSON.parse de mon firefox analysera '{" key ":" value "}' avec succès , mais émet une erreur sur '({" key ":" value "})'. – aularon

+0

Pour contourner les différences dans les navigateurs analysent JSON, je recommande d'utiliser l'analyseur de Douglas Crockford: http://www.json.org/json2.js –

2

Quelques choses que je peux penser:

  1. Assurez-vous de la mise en cache désactivé en cache: false.
  2. Si vous utilisez Firefox, essayez d'utiliser Firebug et l'onglet Net pour surveiller la requête.
  3. Ne comptez pas sur l'analyseur JSON du navigateur. Je recommande celui-ci: https://github.com/douglascrockford/JSON-js/blob/master/json2.js du créateur de JSON pas moins
+1

"trivial et évident" - bien, c'était tout simplement dur. :) –

+0

Bien désolé si c'était vraiment dur. +1 déjà pour faire référence à l'analyseur syntaxique JSON. :) – simplyharsh

+0

juste plaisanter, pas de problème –

1

Je ne suis pas un expert jQuery, mais je sais que bwith Prototype.js, les incendies de gestionnaire d'erreur AJAX si la demande est acceptée, mais le success gestionnaire provoque une erreur. Est-ce la même chose dans jQuery? Vous pouvez tester si c'est ce qui se passe en mettant tout le contenu de display_counts dans un try..catch block.

28

Juste une suggestion, essayez d'utiliser le $.ajaxSetup() pour obtenir l'erreur correcte comme ceci:

$(function() { 
    $.ajaxSetup({ 
     error: function(jqXHR, exception) { 
      if (jqXHR.status === 0) { 
       alert('Not connect.\n Verify Network.'); 
      } else if (jqXHR.status == 404) { 
       alert('Requested page not found. [404]'); 
      } else if (jqXHR.status == 500) { 
       alert('Internal Server Error [500].'); 
      } else if (exception === 'parsererror') { 
       alert('Requested JSON parse failed.'); 
      } else if (exception === 'timeout') { 
       alert('Time out error.'); 
      } else if (exception === 'abort') { 
       alert('Ajax request aborted.'); 
      } else { 
       alert('Uncaught Error.\n' + jqXHR.responseText); 
      } 
     } 
    }); 
}); 
+1

Juste à part, [l'état Docs] (https://api.jquery.com/jquery.ajaxsetup /): * Note: Les fonctions de rappel globales doivent être définies avec leurs méthodes de gestionnaire d'événements Ajax respectives: -ajaxStart(), .ajaxStop(), .ajaxComplete(), .ajaxError(), .ajaxSuccess(), .ajaxSend () - plutôt que dans l'objet options pour $ .ajaxSetup(). * Il semblerait donc que cela soit mieux utilisé dans ['.ajaxError()'] (https://api.jquery.com/ajaxError/) – DelightedD0D

+1

Donc, une chose importante à réaliser est bien sûr que votre ajax pourrait échouer sur l'ordinateur d'un utilisateur si leur connexion Internet est inégale. Ainsi, votre application peut fonctionner correctement, mais elle reçoit des requêtes ajax en raison d'une mauvaise connexion Internet - qui semble être identifiable par les cas 'status === 0' et' exception === 'timeout'' ci-dessus. –

+1

Notez également que les docs déclarent que: "Cela peut provoquer un comportement indésirable puisque les autres appelants (par exemple, les plugins) peuvent s'attendre aux paramètres par défaut. * *" – eis

-1

Changement dataTypeplain/text-html