2009-11-16 23 views
165

Come è possibile gestire gli errori in una chiamata getJSON? Sto provando a fare riferimento a un servizio di script tra domini usando jsonp, come si registra un metodo di errore?Gestione degli errori nelle chiamate getJSON

+0

Sembra essere un duplicato di ** [Come faccio a rilevare jQuery $ .getJSON (o $ .ajax con datatype impostato su 'jsonp') errore quando si utilizza JSONP? ] (http://stackoverflow.com/questions/309953/how-do-i-catch-jquery-getjson-or-ajax-with-datatype-set-to-jsonp-error-w) ** – hippietrail

+0

Ajay, perché non considerando di segnare la risposta corretta? –

+0

@ IonicăBizău Contrassegnato ora. Ho appena perso traccia di questo per un po '. La risposta più importante non sta parlando di JSONP. Come sottolineato da Ben Shelock, non esiste un gestore di errori supportato è quello che io credo .. – Ajay

risposta

7

Sembra che non vi sia alcun metodo di errore da quello che ho letto here. This answer offre una buona spiegazione

256

è un tipo di astrazione di una normale chiamata AJAX in cui dovresti dire che vuoi una risposta codificata JSON.

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

È possibile gestire gli errori in due modi: genericamente (configurando il chiamate AJAX prima di poter realmente li chiama) o specificamente (con catena metodo).

'generico' sarebbe qualcosa di simile:

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

E il modo 'particolare':

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

se si usa il .error() devi usare gli altri due? –

+0

Nops! Puoi andare come ti piace lì.Dai un'occhiata ai documenti per una guida più dettagliata: [http://api.jquery.com/jQuery.ajax](http://api.jquery.com/jQuery.ajax) –

+4

Nota che ciò richiede jQuery 1.5+ (stava cercando di farlo funzionare w/jQuery 1.3 e chiedendosi perché si stava lamentando del metodo invalido :-) – kenyee

77

Qualcuno dare Luciano questi punti :) Ho appena provato la sua risposta -had simile domanda- e ha funzionato perfettamente ...

Ho anche aggiunto i miei 50 cent:

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

Era questo con JSONP tra siti o con lo stesso sito JSON? – hippietrail

+24

Bella risposta! Solo una nota su .error: sarà deprecata in jQuery 1.8, quindi usa [.fail] (http://api.jquery.com/jQuery.ajax/) –

+2

Questo mi ha salvato la vita – KJP

1

Ero di fronte a questo stesso problema, ma piuttosto che creare callback per una richiesta non riuscita, ho semplicemente restituito un errore con l'oggetto dati json.

Se possibile, questa sembra la soluzione più semplice. Ecco un esempio del codice Python che ho usato. (Usando Flask, di Flask jsonify fe SQLAlchemy)

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.") 

Quindi è possibile controllare Javascript come questo;

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

Questo va bene per gli errori che si verificano all'interno il server, ma non acquisisce quando la chiamata non può raggiungere il server o se si verifica un errore prima che colpisca il codice del server, ad esempio se un utente MVC non è più autenticato. –

54

Ecco la mia aggiunta.

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

"Il jqXHR.success(), jqXHR.error(), e jqXHR.complete() callback metodi introdotti in jQuery 1.5 sono obsoleti come di jQuery 1.8. Per preparare il codice per la loro eventuale allontanamento, l'uso jqXHR.done(), jqXHR.fail(), e jqXHR.always() invece "

l'ho fatto, e qui è di Luciano frammento di codice aggiornato:.

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

E con descrizione dell'errore più che mostra tutti i dati JSON come una stringa:

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

Se non ti piace avvisi, sostituirli con 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

qual è l'ordine cronologico di fatto, errore, sempre e il codice all'interno di getJSON? – TheLogicGuy

+0

nota: console.log non è implementato nei browser più vecchi come IE7! Nel caso lo si usi! – MadMad666

9

So che è stato un po ' qualcuno ha risposto qui e il poster probabilmente ha già ottenuto la sua risposta da qui o da qualche altra parte.Tuttavia, penso che questo post aiuterà chiunque cerchi un modo per tenere traccia degli errori e dei timeout durante le richieste getJSON. Quindi sotto la mia risposta alla domanda

La getJSON struttura è la seguente (trovato su http://api.jqueri.com):

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

maggior parte delle persone implementano che l'utilizzo di

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

dove usano l'url var di fornire un collegamento ai dati JSON, il datatosend come luogo per aggiungere "?callback=?" e altre variabili che devono essere inviate per ottenere i dati JSON corretti restituiti e la funzione riuscita come una funzione per l'elaborazione dei dati.

È tuttavia possibile aggiungere le variabili di stato e xhr nella funzione di successo. La variabile di stato contiene una delle seguenti stringhe: "successo", "notmodified", "errore", "timeout", o "ParserError", e la variabile XHR contiene l'oggetto XMLHttpRequest restituita (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"); 
    }   
}); 

In questo modo è facile tenere traccia dei timeout e degli errori senza dover implementare un tracker di timeout personalizzato che viene avviato una volta eseguita una richiesta.

Spero che questo aiuti qualcuno ancora alla ricerca di una risposta a questa domanda.

+2

Questo non funziona. Il callback "success", come suggerisce il nome, è chiamato solo sul successo. (Quindi non sono sicuro di quale sia il parametro "status" per ...) – jwelsh

0

In alcuni casi, è possibile che si verifichi un problema di sincronizzazione con questo metodo. Ho scritto la richiamata automatica all'interno di una funzione setTimeout, e ha funzionato in modo sincrono bene =)

es:

function obterJson(callback) { 


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

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

Perché non

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

??

Per dettagli sulla .fail() metodo usato (jQuery 1.5 +), vedi http://api.jquery.com/jQuery.ajax/#jqXHR

Poiché la jqXHR viene restituito dalla funzione, un concatenamento come

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

è possibile.

0

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

Si fissa in jQuery 2.x; In jQuery 1.x non riceverai mai una richiamata di errore