Jak radzić sobie z błędami w wywołaniu getJSON? Próbuję odwołać się do usługi skryptów między domenami za pomocą jsonp. Jak zarejestrować metodę błędu?
Jak radzić sobie z błędami w wywołaniu getJSON? Próbuję odwołać się do usługi skryptów między domenami za pomocą jsonp. Jak zarejestrować metodę błędu?
Odpowiedzi:
$.getJSON()
jest rodzajem abstrakcji zwykłego wywołania AJAX, w którym musisz powiedzieć, że chcesz odpowiedzi w formacie JSON.
$.ajax({
url: url,
dataType: 'json',
data: data,
success: callback
});
Błędy można obsługiwać na dwa sposoby: ogólnie (konfigurując wywołania AJAX przed ich faktycznym wywołaniem) lub konkretnie (za pomocą łańcucha metod).
„rodzajowy” mógłby wyglądać następująco:
$.ajaxSetup({
"error":function() { alert("error"); }
});
I „specyficzny” sposób:
$.getJSON("example.json", function() {
alert("success");
})
.success(function() { alert("second success"); })
.error(function() { alert("error"); })
.complete(function() { alert("complete"); });
JSONP
ponieważ wydaje się, że getJSON
w takim przypadku nie wywołuje error()
funkcji. Mam ten sam problem. Myślę, że ma to związek z tym, jak JSONP
jest obsługiwane zupełnie inaczej niż normalne AJAX
połączenia jQuery
pomimo getJSON
obsługi obu. JSON
odbywa się za pomocą XMLHTTPRequest
obiektu, ale JSONP
odbywa się to poprzez dynamiczne dodawanie <script>
znacznika do strony HEAD
.
Ktoś dał Luciano te punkty :) Właśnie przetestowałem jego odpowiedź - miałem podobne pytanie - i działałem idealnie ...
Dodaję nawet 50 centów:
.error(function(jqXHR, textStatus, errorThrown) {
console.log("error " + textStatus);
console.log("incoming Text " + jqXHR.responseText);
})
Oto mój dodatek.
Od http://www.learnjavascript.co.uk/jq/reference/ajax/getjson.html i oficjalnego źródła
„ Metody wywołania zwrotnego jqXHR.success (), jqXHR.error () i jqXHR.complete () wprowadzone w jQuery 1.5 są przestarzałe od jQuery 1.8. Aby przygotować kod do ich ewentualnego usunięcia, użyj jqXHR.done (), jqXHR zamiast tego .fail () i jqXHR.always (). "
Zrobiłem to i oto zaktualizowany fragment kodu 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!'); });
Oraz z opisem błędu i pokazaniem wszystkich danych JSON w postaci ciągu:
$.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!'); });
Jeśli nie lubisz powiadomień, zamień je na 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!'); });
Wiem, że minęło trochę czasu, odkąd ktoś odpowiedział tutaj, a plakat prawdopodobnie już otrzymał odpowiedź albo stąd, albo gdzie indziej. Myślę jednak, że ten post pomoże każdemu, kto szuka sposobu śledzenia błędów i przekroczeń limitu czasu podczas wykonywania żądań getJSON. Dlatego poniżej mojej odpowiedzi na pytanie
Struktura getJSON jest następująca (znaleziona na http://api.jqueri.com ):
$(selector).getJSON(url,data,success(data,status,xhr))
większość ludzi wdraża to za pomocą
$.getJSON(url, datatosend, function(data){
//do something with the data
});
tam, gdzie używają url var, aby udostępnić link do danych JSON, datatosend jako miejsce do dodania "?callback=?"
i innych zmiennych, które należy wysłać, aby uzyskać prawidłowe dane JSON, oraz funkcję powodzenia jako funkcję przetwarzania danych .
Możesz jednak dodać zmienne status i xhr do swojej funkcji sukcesu. Zmienna statusu zawiera jeden z następujących ciągów: „sukces”, „niezmodyfikowany”, „błąd”, „limit czasu” lub „parsererror”, a zmienna xhr zawiera zwrócony obiekt XMLHttpRequest ( znaleziony w 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");
}
});
W ten sposób można łatwo śledzić limity czasu i błędy bez konieczności implementowania niestandardowego modułu do śledzenia limitów czasu, który jest uruchamiany po wykonaniu żądania.
Mam nadzieję, że pomoże to komuś, kto wciąż szuka odpowiedzi na to pytanie.
$.getJSON("example.json", function() {
alert("success");
})
.success(function() { alert("second success"); })
.error(function() { alert("error"); })
Zostało to naprawione w jQuery 2.x; W jQuery 1.x nigdy nie otrzymasz wywołania zwrotnego błędu
Miałem do czynienia z tym samym problemem, ale zamiast tworzyć wywołania zwrotne dla nieudanego żądania, po prostu zwróciłem błąd z obiektem danych json.
Jeśli to możliwe, wydaje się to najłatwiejszym rozwiązaniem. Oto próbka użytego kodu Python. (Korzystanie z Flask, jsonify f Flask i 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.")
Następnie możesz sprawdzić Javascript w ten sposób;
$.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
}
});
Dlaczego nie
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.');
})
}
??
Aby uzyskać szczegółowe informacje na temat zastosowanej .fail()
metody (jQuery 1.5+), zobacz http://api.jquery.com/jQuery.ajax/#jqXHR
Ponieważ funkcja jqXHR
jest zwracana przez funkcję, podobny jest łańcuch
$.when(getJSON(...)).then(function() { ... });
jest możliwe.
W niektórych przypadkach możesz napotkać problem z synchronizacją z tą metodą. Napisałem wywołanie zwrotne w setTimeout
funkcji i zadziałało synchronicznie dobrze =)
NA PRZYKŁAD:
function obterJson(callback) {
jqxhr = $.getJSON(window.location.href + "js/data.json", function(data) {
setTimeout(function(){
callback(data);
},0);
}
To dość stary wątek, ale pojawia się w wyszukiwarce Google, więc pomyślałem, że dodam odpowiedź jQuery 3, używając obietnic. Ten fragment pokazuje również:
Fragment kodu to:
$.getJSON({
url: "https://myurl.com/api",
headers: { "Authorization": "Bearer " + user.access_token}
}).then().always( function (data, textStatus) {
$("#txtAPIStatus").html(data.status);
$("#txtAPIValue").html(data.responseText);
});