Haruskah saya menggunakan .done () dan .fail () untuk kode AJAX jQuery baru alih-alih keberhasilan dan kesalahan

166

Saya memiliki kode seperti ini:

$.ajax({ cache: false,
    url: "/Admin/Contents/GetData",
    data: { accountID: AccountID },
    success: function (data) {
        $('#CityID').html(data);
    },
    error: function (ajaxContext) {
        alert(ajaxContext.responseText)
    }
});

Tetapi ketika saya melihat .ajax()dokumentasi jQuery di bagian akhir sepertinya menyarankan saya harus mengkode seperti ini di bawah ini atau setidaknya itu menyarankan menambahkan .done()dan .fail():

var request = $.ajax({ cache: false,
    url: "/Admin/Contents/GetData",
    data: { accountID: AccountID }
});

request.done(function (data) {
    xxx;
});
request.fail(function (jqXHR, textStatus) {
    xxx;
});

Memperbarui

Jika saya kode seperti ini apakah itu sama atau ada beberapa keuntungan untuk memecahnya menjadi tiga?

$.ajax({ cache: false,
    url: "/Admin/Contents/GetData",
    data: { accountID: AccountID }
}).done(function (data) {
    xxx;
}).fail(function (jqXHR, textStatus) {
    xxx;
});
Alan2
sumber

Jawaban:

164

Seperti yang dinyatakan oleh user2246674, menggunakan successdan errorsebagai parameter fungsi ajax valid.

Agar konsisten dengan jawaban preseden, baca dokumen:

Pemberitahuan Penghentian :

Panggilan balik jqXHR.success (), jqXHR.error (), dan jqXHR.complete () akan dihentikan di jQuery 1.8. Untuk menyiapkan kode Anda untuk penghapusan akhirnya, gunakan jqXHR.done (), jqXHR.fail (), dan jqXHR.always () sebagai gantinya.

Jika Anda menggunakan fungsi manipulasi-balik (misalnya menggunakan metode-chaining), gunakan .done(), .fail()dan .always()bukannya success(), error()dan complete().

Michael Laffargue
sumber
54
Saya tidak setuju. Referensi berbicara tentang fungsi manipulasi-balik (mis. .error, .success) Yang tidak digunakan lagi untuk pola Ditangguhkan yang lebih universal, tetapi parameter pada ajaxmetode ini tidak ditinggalkan dan keduanya valid dan dapat diterima - bahkan di jQuery 1.9 / 2.0! Dalam semua bentuk saat ini, ajaxmasih mengembalikan Ditangguhkan; mungkin dengan Callback tangguhan yang sudah terpasang.
user2246674
1
Ini dia, jQuery 1.9, dan sukses :, error :, dan complete: masih bisa digunakan. Namun, pertanyaan saya adalah, apakah .done () == berhasil:?
TARKUS
3
@GregoryLewis Dari JQuery 1.10 kode sumber: jqXHR.success = jqXHR.done;.
Michael Laffargue
9
Aku akan jujur lebih suka success, fail, always.
ahnbizcad
4
WOW, saya salah membaca dokumentasi juga. Saya benar-benar berpikir opsi 'sukses' / 'kesalahan' untuk $ .ajax ditulis ulang menjadi 'selesai / gagal'. Itu hanya rantai metode panggilan balik. Jujur, saya pikir mereka seharusnya mengganti nama opsi juga. Itu membuat saya bingung selama berjam-jam.
OzzyTheGiant
12

Saya ingin menambahkan sesuatu di pos @Michael Laffargue:

jqXHR.done() lebih cepat!

jqXHR.success()memiliki beberapa waktu buka dalam panggilan balik dan kadang-kadang dapat melebihi batas skrip. Saya menemukan itu di jalan yang sulit sebelumnya.

MEMPERBARUI:

Menggunakan jqXHR.done(), jqXHR.fail()dan jqXHR.always()Anda dapat memanipulasi dengan lebih baik dengan permintaan ajax. Secara umum Anda dapat mendefinisikan ajax di beberapa variabel atau objek dan menggunakan variabel atau objek itu di bagian mana pun dari kode Anda dan mendapatkan data lebih cepat. Contoh yang baik:

/* Initialize some your AJAX function */
function call_ajax(attr){
    var settings=$.extend({
        call            : 'users',
        option          : 'list'
    }, attr );

    return $.ajax({
        type: "POST",
        url: "//exapmple.com//ajax.php",
        data: settings,
        cache : false
    });
}

/* .... Somewhere in your code ..... */

call_ajax({
    /* ... */
    id : 10,
    option : 'edit_user'
    change : {
          name : 'John Doe'
    }
    /* ... */
}).done(function(data){

    /* DO SOMETHING AWESOME */

});
Ivijan Stefan Stipic
sumber
9
Apakah Anda memiliki referensi yang kredibel dan dapat diverifikasi?
Paul Vargas
@ PaulVargas Saya tidak pernah melakukan beberapa tes kinerja tetapi dalam praktik saya menemukan ini berhasil. Anda bisa mencobanya sendiri.
Ivijan Stefan Stipic
1
Harap berikan bukti apa pun yang dapat dipercaya.
wonsuc
Seperti Anda ketahui, fungsi panggilan balik lebih lambat dibandingkan untuk mengembalikan beberapa objek dari fungsi. Terkadang dampaknya kecil tetapi terkadang bisa sangat besar jika Anda memiliki banyak panggilan.
Ivijan Stefan Stipic
7

Dengan kata-kata sederhana

$.ajax("info.txt").done(function(data) {
  alert(data);
}).fail(function(data){
  alert("Try again champ!");
});

jika mendapatkan info.text maka ia akan memberitahukan dan fungsi apa pun yang Anda tambahkan atau jika ada bagaimana tidak dapat mengambil info.text dari server maka waspada atau fungsi kesalahan.

Yasir
sumber
0

Ketika kita akan memigrasi JQuery dari 1.x ke 2x atau 3.x di aplikasi lama kita yang sudah ada, maka kita akan menggunakan .done, .fail bukannya berhasil, kesalahan karena gradasi JQuery ke atas akan ditinggalkan metode ini. Untuk contoh ketika kita melakukan panggilan ke metode web server maka server mengembalikan objek janji ke metode panggilan (metode Ajax) dan objek janji ini berisi metode .done, .fail..etc. Oleh karena itu kita akan melakukan hal yang sama untuk keberhasilan dan kegagalan respons. Di bawah ini adalah contohnya (ini untuk permintaan POST dengan cara yang sama kita dapat membangun untuk jenis permintaan seperti GET ...)

 $.ajax({
            type: "POST",
            url: url,
            data: '{"name" :"sheo"}',
            contentType: "application/json; charset=utf-8",
            async: false,
            cache: false
            }).done(function (Response) {
                  //do something when get response            })
           .fail(function (Response) {
                    //do something when any error occurs.
                });
Sheo Dayal Singh
sumber