it-swarm.com.de

Fehlerbehandlung bei getJSON-Aufrufen

Wie können Sie Fehler in einem getJSON-Aufruf behandeln? Ich versuche, einen domänenübergreifenden Skriptdienst mit jsonp zu referenzieren. Wie registriere ich eine Fehlermethode?

182
Ajay

$.getJSON() ist eine Art Abstraktion eines regulären AJAX) Aufrufs, bei dem Sie angeben müssten, dass Sie eine JSON-codierte Antwort wünschen.

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

Sie können Fehler auf zwei Arten behandeln: generisch (indem Sie Ihre AJAX Aufrufe konfigurieren, bevor Sie sie tatsächlich aufrufen) oder spezifisch (mit Methodenkette).

'generisch' wäre so etwas wie:

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

Und der "spezifische" Weg:

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

Jemand gibt Luciano diese Punkte :) Ich habe gerade seine Antwort getestet - hatte eine ähnliche Frage - und es hat perfekt funktioniert ...

Ich addiere sogar meine 50 Cent:

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

Hier ist mein Zusatz.

Von http://www.learnjavascript.co.uk/jq/reference/ajax/getjson.html und die offizielle Quelle

" Die in jQuery 1.5 eingeführten Callback-Methoden jqXHR.success (), jqXHR.error () und jqXHR.complete () sind ab jQuery 1.8 veraltet. So bereiten Sie Ihren Code auf das eventuelle Entfernen vor Verwenden Sie stattdessen jqXHR.done (), jqXHR.fail () und jqXHR.always (). "

Ich habe das getan und hier ist Lucianos aktualisierter Codeausschnitt:

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

Und mit Fehlerbeschreibung und der Anzeige aller JSON-Daten als Zeichenfolge:

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

Wenn Ihnen Warnungen nicht gefallen, ersetzen Sie sie durch 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!'); });
63
user2314737

Ich weiß, dass es eine Weile her ist, dass jemand hier geantwortet hat und das Poster wahrscheinlich schon seine Antwort von hier oder von woanders bekommen hat. Ich denke jedoch, dass dieser Beitrag jedem helfen wird, der nach einer Möglichkeit sucht, Fehler und Zeitüberschreitungen beim Ausführen von getJSON-Anforderungen zu verfolgen. Deshalb unten meine Antwort auf die Frage

Die getJSON-Struktur lautet wie folgt (gefunden auf http://api.jqueri.com ):

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

die meisten Leute implementieren das mit

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

dort, wo sie die URL-Variable verwenden, um einen Link zu den JSON-Daten bereitzustellen, wird der Datensatz als Ort zum Hinzufügen des "?callback=?" und andere Variablen, die gesendet werden müssen, um die korrekten JSON-Daten zurückzugeben, und die Erfolgsfunktion als Funktion für die Verarbeitung der Daten.

Sie können jedoch die Variablen status und xhr in Ihrer Erfolgsfunktion hinzufügen. Die Statusvariable enthält eine der folgenden Zeichenfolgen: "success", "notmodified", "error", "timeout" oder "parsererror". Die Variable xhr enthält das zurückgegebene XMLHttpRequest-Objekt ( gefunden in 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");
    }         
});

Auf diese Weise können Sie Zeitüberschreitungen und Fehler auf einfache Weise verfolgen, ohne einen benutzerdefinierten Zeitüberschreitungs-Tracker implementieren zu müssen, der nach Abschluss einer Anforderung gestartet wird.

Hoffe das hilft jemandem noch auf der Suche nach einer Antwort auf diese Frage.

12
Tom Groentjes

Anscheinend gibt es keine Fehlermethode von dem, was ich gelesen habe hier . Diese Antwort bietet eine gute Erklärung

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

Es ist in jQuery 2.x behoben. In jQuery 1.x erhalten Sie niemals einen Fehler-Rückruf

2
Pavlo O.

Warum nicht

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

??

Einzelheiten zur verwendeten .fail() -Methode (jQuery 1.5+) finden Sie unter http://api.jquery.com/jQuery.ajax/#jqXHR

Da das jqXHR von der Funktion zurückgegeben wird, mag eine Verkettung

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

ist möglich.

1
Blauhirn

Ich war mit demselben Problem konfrontiert, aber anstatt Rückrufe für eine fehlgeschlagene Anforderung zu erstellen, gab ich einfach einen Fehler mit dem json-Datenobjekt zurück.

Wenn möglich, scheint dies die einfachste Lösung zu sein. Hier ist ein Beispiel des verwendeten Python Codes. (Mit Flask, Flask's jsonify f und 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.")

Dann können Sie Javascript so überprüfen;

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

In einigen Fällen kann ein Synchronisationsproblem mit dieser Methode auftreten. Ich habe den Callback-Aufruf in eine setTimeout -Funktion geschrieben, und es hat synchron funktioniert =)

Z.B:

function obterJson(callback) {


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

    setTimeout(function(){
        callback(data);
    },0);
}
0
Alex Alonso