Bagaimana Anda bisa menangani kesalahan dalam panggilan getJSON? Saya mencoba merujuk layanan skrip lintas domain menggunakan jsonp, bagaimana Anda mendaftarkan metode kesalahan?
Bagaimana Anda bisa menangani kesalahan dalam panggilan getJSON? Saya mencoba merujuk layanan skrip lintas domain menggunakan jsonp, bagaimana Anda mendaftarkan metode kesalahan?
Jawaban:
$.getJSON()
adalah sejenis abstraksi panggilan AJAX biasa di mana Anda harus mengatakan bahwa Anda menginginkan respons yang dikodekan JSON.
$.ajax({
url: url,
dataType: 'json',
data: data,
success: callback
});
Anda dapat menangani kesalahan dalam dua cara: secara umum (dengan mengkonfigurasi panggilan AJAX Anda sebelum benar-benar memanggil mereka) atau secara khusus (dengan rantai metode).
'generik' akan seperti:
$.ajaxSetup({
"error":function() { alert("error"); }
});
Dan cara 'spesifik':
$.getJSON("example.json", function() {
alert("success");
})
.success(function() { alert("second success"); })
.error(function() { alert("error"); })
.complete(function() { alert("complete"); });
JSONP
yang sepertinya getJSON
tidak memanggil error()
fungsi tersebut. Saya mempunyai masalah yang sama. Saya kira ini ada hubungannya dengan bagaimana JSONP
penanganannya sama sekali berbeda dengan AJAX
panggilan biasa jQuery
meskipun getJSON
menangani keduanya. JSON
dilakukan dengan XMLHTTPRequest
objek tetapi JSONP
dilakukan dengan menambahkan <script>
tag secara dinamis ke halaman HEAD
.
Seseorang memberi Luciano poin-poin ini :) Saya baru saja menguji jawabannya - memiliki pertanyaan serupa - dan bekerja dengan sempurna ...
Saya bahkan menambahkan 50 sen:
.error(function(jqXHR, textStatus, errorThrown) {
console.log("error " + textStatus);
console.log("incoming Text " + jqXHR.responseText);
})
Ini tambahan saya.
Dari http://www.learnjavascript.co.uk/jq/reference/ajax/getjson.html dan sumber resmi
" Metode jqXHR.success (), jqXHR.error (), dan jqXHR.complete () yang diperkenalkan di jQuery 1.5 sudah tidak digunakan lagi pada jQuery 1.8. Untuk menyiapkan kode Anda untuk penghapusan akhirnya, gunakan jqXHR.done (), jqXHR .fail (), dan jqXHR.always () sebagai gantinya. "
Saya melakukan itu dan di sini adalah potongan kode Luciano yang diperbarui:
$.getJSON("example.json", function() {
alert("success");
})
.done(function() { alert('getJSON request succeeded!'); })
.fail(function() { alert('getJSON request failed! '); })
.always(function() { alert('getJSON request ended!'); });
Dan dengan deskripsi kesalahan plus menampilkan semua data json sebagai string:
$.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!'); });
Jika Anda tidak menyukai lansiran, gantikan dengan 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!'); });
Saya tahu sudah lama sejak seseorang menjawab di sini dan poster mungkin sudah mendapatkan jawabannya baik dari sini atau dari tempat lain. Namun saya berpikir bahwa posting ini akan membantu siapa saja yang mencari cara untuk melacak kesalahan dan batas waktu saat melakukan permintaan getJSON. Oleh karena itu di bawah ini saya menjawab pertanyaan itu
Struktur getJSON adalah sebagai berikut (ditemukan di http://api.jqueri.com ):
$(selector).getJSON(url,data,success(data,status,xhr))
kebanyakan orang menerapkan itu menggunakan
$.getJSON(url, datatosend, function(data){
//do something with the data
});
di mana mereka menggunakan url var untuk menyediakan tautan ke data JSON, datatosend sebagai tempat untuk menambahkan "?callback=?"
dan variabel lain yang harus dikirim untuk mendapatkan data JSON yang benar dikembalikan, dan fungsi sukses sebagai fungsi untuk memproses data .
Namun Anda dapat menambahkan status dan variabel xhr di fungsi kesuksesan Anda. Variabel status berisi salah satu string berikut: "sukses", "notmodified", "error", "timeout", atau "parsererror", dan variabel xhr berisi objek XMLHttpRequest yang dikembalikan ( ditemukan di 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");
}
});
Dengan cara ini, mudah untuk melacak batas waktu dan kesalahan tanpa harus menerapkan pelacak batas waktu khusus yang dimulai setelah permintaan selesai.
Semoga ini bisa membantu seseorang yang masih mencari jawaban untuk pertanyaan ini.
$.getJSON("example.json", function() {
alert("success");
})
.success(function() { alert("second success"); })
.error(function() { alert("error"); })
Itu diperbaiki di jQuery 2.x; Di jQuery 1.x Anda tidak akan pernah mendapatkan panggilan balik kesalahan
Saya dihadapkan dengan masalah yang sama, tetapi daripada membuat panggilan balik untuk permintaan yang gagal, saya hanya mengembalikan kesalahan dengan objek data json.
Jika memungkinkan, ini sepertinya solusi termudah. Ini contoh kode Python yang saya gunakan. (Menggunakan Flask, Flask's jsonify f dan 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.")
Kemudian Anda dapat memeriksa Javascript seperti ini;
$.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
}
});
Kenapa tidak
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.');
})
}
??
Untuk detail tentang .fail()
metode yang digunakan (jQuery 1.5+), lihat http://api.jquery.com/jQuery.ajax/#jqXHR
Karena jqXHR
dikembalikan oleh fungsi, seperti rantai
$.when(getJSON(...)).then(function() { ... });
adalah mungkin.
Dalam beberapa kasus, Anda mungkin mengalami masalah sinkronisasi dengan metode ini. Saya menulis panggilan balik di dalam asetTimeout
fungsi, dan itu bekerja secara serentak =)
MISALNYA:
function obterJson(callback) {
jqxhr = $.getJSON(window.location.href + "js/data.json", function(data) {
setTimeout(function(){
callback(data);
},0);
}
Ini adalah utas yang cukup lama, tetapi muncul di pencarian Google, jadi saya pikir saya akan menambahkan jawaban jQuery 3 menggunakan janji. Cuplikan ini juga menunjukkan:
Cuplikan kode adalah:
$.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);
});