2010-09-04 19 views
33

Ho bisogno di alcuni suggerimenti qui o forse alcune spiegazioni. Ho una chiamata jquery ajax,jquery ajax errore callback

$.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 
}); 

Sta funzionando bene. Il mio callback success si attiva correttamente con la risposta. Ma, quello che ho notato è che il mio error callback viene sparato ogni volta, anche quando il mio stato di chiamata restituisce successo 200. In precedenza error richiamata, vedo che oggetto xhr.status è 200.

Qualcuno può spiegare che cosa c'è che non va, o che cosa sta succedendo qui? Il callback error si attiva solo quando ho una risposta 404 o forse non 200. Le mie supposizioni sono corrette?

Grazie.

risposta

24

callback errore è chiamato errori HTTP, ma anche se JSON analisi sulla risposta fallisce. Questo è ciò che probabilmente sta accadendo se il codice di risposta è 200, ma si è ancora lanciati alla richiamata di errore.

+2

Se si prevede una risposta non JSON. Puoi impostare l'opzione dataType su script/testo ... ecc. Esegui il controllo http://api.jquery.com/jQuery.ajax e guarda sotto dataFilter per maggiori informazioni. – thekindofme

+0

Stavo chiamando uno script cgi, ne avevo bisogno per scaricare i dati in formato json. Stava restituendo una stringa che non funzionava. – NuclearPeon

1

Un recent question avuto problema simile con json richieste jQuery, provare a rimuovere circostante () dalla tua risposta JSON.

+0

divertente, ho avuto un problema simile che è stato fissato con l'aggiunta * * parentesi circostanti. –

+0

@Coronatus Sì, questo è quello che usavo di solito, ma jquery 1.4.2 inizia a fare affidamento su 'JSON.parse del browser ', il mio' JSON.parse' del mio firefox analizzerebbe '{" chiave ":" valore "}' con successo , ma emetti un errore su '({" chiave ":" valore "})'. – aularon

+0

Per aggirare le differenze in cui i browser analizzano JSON, consiglierei di usare il parser di Douglas Crockford: http://www.json.org/json2.js –

2

Un paio di cose mi vengono in mente:

  1. Assicurarsi di avere la cache disabilitata impostando cache: false.
  2. Se si utilizza Firefox, provare a utilizzare Firebug e la scheda Rete per monitorare la richiesta
  3. Non fare affidamento sul parser JSON del browser. Vorrei raccomandare questo uno: https://github.com/douglascrockford/JSON-js/blob/master/json2.js dal creatore di JSON non meno
+1

"banale e ovvio" - beh, era semplicemente duro. :) –

+0

Beh, mi dispiace se è stato davvero duro. +1 già per fare riferimento alla cosa del parser JSON. :) – simplyharsh

+0

scherzando, nessun problema –

1

Io non sono un esperto di jQuery, ma so che bwith Prototype.js, i fuochi AJAX gestore di errore se la richiesta è successo, ma la success gestore provoca un errore. È lo stesso in jQuery? È possibile verificare se questo è ciò che accade inserendo l'intero contenuto di display_counts in un try..catch block.

28

Solo un suggerimento, provare a utilizzare il $.ajaxSetup() per ottenere l'errore corretto in questo modo:

$(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

Solo a parte, [lo stato di Documenti] (https://api.jquery.com/jquery.ajaxsetup /): * Nota: le funzioni di callback globali devono essere impostate con i rispettivi metodi globali di gestore di eventi Ajax: .ajaxStart(), .ajaxStop(), .ajaxComplete(), .ajaxError(), .ajaxSuccess(), .ajaxSend () - piuttosto che all'interno dell'oggetto opzioni per $ .ajaxSetup(). * Quindi sembrerebbe che sarebbe meglio usarlo in ['.ajaxError()'] (https://api.jquery.com/ajaxError/) – DelightedD0D

+1

Quindi, una cosa importante da realizzare è che la tua ajax potrebbe fallire sul computer di un utente se la connessione internet è scarsa. Pertanto, la tua app potrebbe funzionare correttamente, ma a causa delle cattive condizioni di connessione a Internet, le richieste ajax falliscono, il che sembra essere identificabile dai casi 'status === 0' e' exception === 'timeout'' sopra. –

+1

Si noti inoltre che: "Ciò può causare comportamenti indesiderati poiché altri chiamanti (ad esempio, plug-in) potrebbero aspettarsi le normali impostazioni predefinite. Per tale motivo raccomandiamo vivamente di non utilizzare questa API." " – eis

-1

Variazione dataTypeplain/text-html

Problemi correlati