Fungsi kesalahan ajax jQuery

130

Saya memiliki panggilan ajax meneruskan data ke halaman yang kemudian mengembalikan nilai.

Saya telah mengambil panggilan yang berhasil dari halaman tetapi saya telah mengkodekannya sehingga menimbulkan kesalahan dalam asp. Bagaimana saya mengambil kesalahan itu dari jquery?

Sebagai contoh:

cache: false,
url: "addInterview_Code.asp",
type: "POST",
datatype: "text",
data: strData,
success: function (html) {
    alert('successful : ' + html);
    $("#result").html("Successful");
},
error: function (error) {
    **alert('error; ' + eval(error));**
}

Ini sedikit kesalahan yang saya tidak mengerti. Dalam fungsi parameter apa yang harus saya masukkan, sehingga saya kemudian dapat menggunakan pesan kesalahan yang saya angkat di server.

Darryl Wilson
sumber
Ada kesalahan ketik di sana: dataTypetidak datatype.
Alejandro Nava
Selain itu, jQuery mengatakan Anda tidak dapat menggunakan kesuksesan dan kesalahan , seperti yang Anda lakukan.
Alejandro Nava
7
@ alej27: kata-katanya agak aneh, tetapi tidak mengatakan Anda tidak dapat menggunakan keduanya, ia mengatakan permintaan tidak akan memanggil kesuksesan dan kesalahan (karena mereka saling eksklusif).
Marty Vance
Gunakan perawatan dengan jawaban di sini Pada jQuery 3.0 yang sudah usang dicatat .errordan .successmenjadi lebih penting karena telah dihapus.
Mark Schultheiss

Jawaban:

222

Parameter yang diperlukan dalam errorfungsi Ajax adalah jqXHR, exceptiondan Anda dapat menggunakannya seperti di bawah ini:

$.ajax({
    url: 'some_unknown_page.html',
    success: function (response) {
        $('#post').html(response.responseText);
    },
    error: function (jqXHR, exception) {
        var msg = '';
        if (jqXHR.status === 0) {
            msg = 'Not connect.\n Verify Network.';
        } else if (jqXHR.status == 404) {
            msg = 'Requested page not found. [404]';
        } else if (jqXHR.status == 500) {
            msg = 'Internal Server Error [500].';
        } else if (exception === 'parsererror') {
            msg = 'Requested JSON parse failed.';
        } else if (exception === 'timeout') {
            msg = 'Time out error.';
        } else if (exception === 'abort') {
            msg = 'Ajax request aborted.';
        } else {
            msg = 'Uncaught Error.\n' + jqXHR.responseText;
        }
        $('#post').html(msg);
    },
});

DEMO FIDDLE


Parameter

jqXHR:

Ini sebenarnya adalah objek kesalahan yang terlihat seperti ini

Ajax error objek jqXHR

Anda juga dapat melihat ini di konsol browser Anda sendiri, dengan menggunakan console.logdi dalam errorfungsi seperti:

error: function (jqXHR, exception) {
    console.log(jqXHR);
    // Your error handling logic here..
}

Kami menggunakan statusproperti dari objek ini untuk mendapatkan kode kesalahan, seperti jika kami mendapatkan status = 404 ini berarti halaman yang diminta tidak dapat ditemukan. Tidak ada sama sekali. Berdasarkan kode status itu, kami dapat mengarahkan pengguna ke halaman login atau apa pun yang diperlukan logika bisnis kami.

pengecualian:

Ini adalah variabel string yang menunjukkan tipe pengecualian. Jadi, jika kita mendapatkan 404 kesalahan, exceptionteks akan menjadi 'kesalahan'. Demikian pula, kita mungkin mendapatkan 'batas waktu', 'batalkan' sebagai teks pengecualian lainnya.


Pemberitahuan Penghentian: The jqXHR.success(),, jqXHR.error()dan jqXHR.complete()callback tidak digunakan lagi pada jQuery 1.8. Untuk mempersiapkan kode untuk penghapusan akhirnya mereka, menggunakan jqXHR.done(), jqXHR.fail()dan jqXHR.always()sebagai gantinya.

Jadi, jika Anda menggunakan jQuery 1.8 atau lebih baru, kami perlu memperbarui logika fungsi keberhasilan dan kesalahan seperti: -

// Assign handlers immediately after making the request,
// and remember the jqXHR object for this request
var jqxhr = $.ajax("some_unknown_page.html")
    .done(function (response) {
        // success logic here
        $('#post').html(response.responseText);
    })
    .fail(function (jqXHR, exception) {
        // Our error logic here
        var msg = '';
        if (jqXHR.status === 0) {
            msg = 'Not connect.\n Verify Network.';
        } else if (jqXHR.status == 404) {
            msg = 'Requested page not found. [404]';
        } else if (jqXHR.status == 500) {
            msg = 'Internal Server Error [500].';
        } else if (exception === 'parsererror') {
            msg = 'Requested JSON parse failed.';
        } else if (exception === 'timeout') {
            msg = 'Time out error.';
        } else if (exception === 'abort') {
            msg = 'Ajax request aborted.';
        } else {
            msg = 'Uncaught Error.\n' + jqXHR.responseText;
        }
        $('#post').html(msg);
    })
    .always(function () {
        alert("complete");
    });

Semoga ini bisa membantu!

palaѕн
sumber
6
Menariknya tidak dianjurkan untuk menggunakan ajaxSetup. Lihat api.jquery.com/jquery.ajaxsetup
SleepyBoBos
1
@ palaѕн Saya pikir Anda salah membaca pemberitahuan penghentian. Jika Anda perhatikan, pemberitahuan penghentian berbicara tentang penghentian metode jqXHR, tetapi penggunaan kesuksesan, kesalahan dan lengkap dalam contoh Anda di atas dilakukan dalam objek dengan metode $ .ajax. Ini belum ditinggalkan dan Anda tidak perlu mengganti kode Anda. Namun, jika seseorang lebih memilih untuk merangkai metode maka Anda bisa menggunakan gaya ini. Ketika saya membaca "penghinaan ..." ini membuat saya marah (tanpa alasan). :-)
bchr02
Pada jQuery 3.0 yang sudah usang dicatat .errordan .successmenjadi lebih penting karena mereka telah dihapus
Mark Schultheiss
99

Coba ini:

error: function(jqXHR, textStatus, errorThrown) {
  console.log(textStatus, errorThrown);
}

Jika Anda ingin memberi tahu frontend Anda tentang kesalahan validasi, coba kembalikan json:

dataType: 'json',
success: function(data, textStatus, jqXHR) {
   console.log(data.error);
}

Skrip asp Anda akan kembali:

{"error": true}
Czerasz
sumber
1
Apa itu textSttaus dan errorThrown untuk? Bisakah Anda jelaskan
Annapurna
4

Inilah cara Anda mengeluarkan kesalahan asp.

              cache: false,
              url: "addInterview_Code.asp",
              type: "POST",
              datatype: "text",
              data: strData,
              success: function (html) {
                  alert('successful : ' + html);
                  $("#result").html("Successful");
              },
              error: function (jqXHR, textStatus, errorThrown) {
                  if (jqXHR.status == 500) {
                      alert('Internal error: ' + jqXHR.responseText);
                  } else {
                      alert('Unexpected error.');
                  }
              }
Kaya C
sumber
2
error(jqXHR, textStatus, errorThrown)

http://api.jquery.com/jQuery.ajax/

Praveen Prasad
sumber
9
Berikan penjelasan, bukan hanya sepotong kode dan tautan do docs.
Greg Dubicki
12
Terima kasih hampir tidak ada.
Judasane
misalnya, Anda bisa mengatakan "OP menggunakan kesalahan fungsi (error) tetapi jquery memanggil kesalahan fungsi (jqXHR, textStatus, errorThrown). Perhatikan 2 parameter yang hilang dalam cuplikan OP."
increddibelly
2
          cache: false,
          url: "addInterview_Code.asp",
          type: "POST",
          datatype: "text",
          data: strData,
          success: function (html) {
              alert('successful : ' + html);
              $("#result").html("Successful");
          },
          error: function(data, errorThrown)
          {
              alert('request failed :'+errorThrown);
          }
sT0n3
sumber
2

Anda menggunakan suatu fungsi

error(error) 

tetapi jquery sebenarnya mencari fungsi dengan tiga parameter:

error(jqXHR, textStatus, errorThrown)

Anda harus menambahkan dua parameter lagi.

JUGA: silakan lihat semua komentar di atas yang menyebutkan 'usang' :)

$.ajax("www.stackoverflow.com/api/whatever", {
    dataType:"JSON"
    data: { id=1, name='example' }
}).succes(function (result) {
    // use result
}).error(function (jqXHR, textStatus, errorThrown) {
    // handle error
});
tidak percaya
sumber
4
Anda harus menambahkan dua parameter lagi - ini sangat salah.
Pengembang
1
hmm jika hanya itu yang harus Anda katakan - mungkin tidak mengatakan apa-apa? atau, Anda BISA menjelaskan pernyataan Anda dan benar-benar membantu. Pilihanmu.
increddibelly
1
Dalam JavaScript, misalkan Anda memiliki metode - function myMethod (err) { alert(err); }dan menyebutnya seperti myMethod ("something is wrong", 500, some_object)- Ini akan berfungsi tanpa masalah. Sesuai pernyataan Anda, ini hanya akan berfungsi jika metode tanda tangan adalah function myMethod (err, status, some_object). Lupakan contoh di atas, tanda tangan successacara yang Anda miliki dalam jawaban sebenarnya .success(data, status, xhr), tetapi jika Anda hanya membutuhkan hasilnya, kami biasanya mengikatnya seperti .success (data)dan keduanya berfungsi.
Pengembang
Dan apa nilai tambah yang Anda bawa dengan menambahkan jawaban ini? IMO tidak ada info dalam jawaban Anda yang tidak ada di jawaban sebelumnya. Satu-satunya hal yang Anda lakukan adalah menarik pertanyaan ini kembali ke tumpukan.
Pengembang
0

Dari jquery.com:

The jqXHR.success(), jqXHR.error(), and jqXHR.complete()
callback methods introduced injQuery 1.5 are deprecated
as of jQuery 1.8. To prepare your code for their eventual 
removal, use jqXHR.done(), jqXHR.fail(), and jqXHR.always() instead.

Jika Anda menginginkan penangan global, Anda dapat menggunakan:

.ajaxStart(), .ajaxStop(),
.ajaxComplete(), .ajaxError(),
.ajaxSuccess(), .ajaxSend()
John Kloian
sumber