Kesalahan dalam menangani panggilan getJSON

192

Bagaimana Anda bisa menangani kesalahan dalam panggilan getJSON? Saya mencoba merujuk layanan skrip lintas domain menggunakan jsonp, bagaimana Anda mendaftarkan metode kesalahan?

Ajay
sumber
Ajay, mengapa tidak mempertimbangkan menandai jawaban yang benar?
Ionică Bizău
@ IonicăBizău Menandainya sekarang. Saya baru saja kehilangan jejak ini untuk sementara waktu. Jawaban teratas tidak berbicara tentang JSONP. Seperti yang ditunjukkan oleh Ben Shelock, tidak ada penangan kesalahan yang didukung adalah apa yang saya yakini ..
Ajay

Jawaban:

277

$.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"); });
Luciano Costa
sumber
Tidak! Anda bisa pergi sesuka Anda di sana. Lihatlah dokumen untuk bantuan lebih rinci: http://api.jquery.com/jQuery.ajax
Luciano Costa
5
Perhatikan bahwa ini memerlukan jQuery 1.5+ (sedang mencoba membuatnya bekerja dengan jQuery 1.3 dan bertanya-tanya mengapa ia mengeluh tentang metode yang tidak valid :-)
kenyee
24
OP bertanya secara spesifik tentang cross-site JSONPyang sepertinya getJSONtidak memanggil error()fungsi tersebut. Saya mempunyai masalah yang sama. Saya kira ini ada hubungannya dengan bagaimana JSONPpenanganannya sama sekali berbeda dengan AJAXpanggilan biasa jQuerymeskipun getJSONmenangani keduanya. JSONdilakukan dengan XMLHTTPRequestobjek tetapi JSONPdilakukan dengan menambahkan <script>tag secara dinamis ke halaman HEAD.
hippietrail
3
Dokumen jQuery mengatakan "Catatan: Handler ini tidak dipanggil untuk skrip lintas-domain dan permintaan JSONP." api.jquery.com/jQuery.ajax > error
OneWorld
10
"Metode jqXHR.success (), jqXHR.error (), dan jqXHR.complete () yang diperkenalkan di jQuery 1.5 tidak digunakan pada jQuery 1.5. Untuk mempersiapkan kode Anda untuk penghapusan akhirnya, gunakan jqXHR.done (), jqXHR .fail (), dan jqXHR.always () sebagai gantinya. "
Skorunka František
86

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);
    })
frenetix
sumber
3
Apakah ini dengan JSONP lintas situs atau dengan JSON situs yang sama?
hippietrail
28
Jawaban bagus! Hanya sebuah catatan tentang .error: Ini akan usang dalam jQuery 1.8, jadi gunakan .fail
Anatoly Mironov
73

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!'); });
pengguna2314737
sumber
apa urutan kronologis yang dilakukan, gagal, selalu dan kode di dalam getJSON?
TheLogicGuy
Catatan: console.log tidak diimplementasikan di browser lama seperti IE7! Kalau-kalau Anda menggunakannya!
MadMad666
12

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.

Tom Groentjes
sumber
2
Ini tidak berhasil. Callback "sukses", seperti namanya, hanya disebut sebagai kesuksesan. (Jadi saya tidak yakin apa parameter "status" untuk ...)
jwelsh
4

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

Pavlo O.
sumber
1

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
    }
});
Nick Woodham
sumber
Ini bagus untuk kesalahan yang terjadi di dalam server, tetapi tidak menangkap ketika panggilan tidak dapat mencapai server atau jika ada kesalahan yang dilemparkan sebelum hits kode server, seperti jika pengguna MVC tidak lagi dikonfirmasi.
Lee Oades
1

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 jqXHRdikembalikan oleh fungsi, seperti rantai

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

adalah mungkin.

phil294
sumber
0

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);
}
Alex Alonso
sumber
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:

  • Anda tidak perlu lagi beralih ke $ .ajax untuk memberikan token pembawa Anda
  • Gunakan .then () untuk memastikan Anda dapat memproses secara sinkron hasil apa pun (saya menemukan masalah ini. Selalu () panggilan balik diaktifkan terlalu cepat - walaupun saya tidak yakin itu 100% benar)
  • Saya menggunakan .always () untuk menunjukkan hasil apakah positif atau negatif
  • Dalam fungsi .always () saya memperbarui dua target dengan kode Status HTTP dan badan pesan

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);
    });
Dari Orbonia
sumber