success
telah menjadi nama tradisional dari callback sukses di jQuery, didefinisikan sebagai opsi dalam panggilan ajax. Namun, sejak implementasi $.Deferreds
dan callback yang lebih canggih, done
adalah cara yang disukai untuk mengimplementasikan callback yang sukses, karena dapat dipanggil pada semua deferred
.
Misalnya, sukses:
$.ajax({
url: '/',
success: function(data) {}
});
Misalnya dilakukan:
$.ajax({url: '/'}).done(function(data) {});
Yang menyenangkan tentang done
nilai pengembalian $.ajax
sekarang adalah janji yang ditangguhkan yang dapat terikat ke tempat lain di aplikasi Anda. Jadi katakanlah Anda ingin melakukan panggilan ajax ini dari beberapa tempat yang berbeda. Bukan lewat fungsi keberhasilan Anda sebagai pilihan untuk fungsi yang membuat panggilan ajax ini, Anda hanya dapat memiliki fungsi kembali $.ajax
itu sendiri dan mengikat callback Anda dengan done
, fail
, then
, atau apa pun. Perhatikan bahwa always
ini adalah panggilan balik yang akan berjalan apakah permintaan berhasil atau gagal. done
hanya akan terpicu pada kesuksesan.
Sebagai contoh:
function xhr_get(url) {
return $.ajax({
url: url,
type: 'get',
dataType: 'json',
beforeSend: showLoadingImgFn
})
.always(function() {
// remove loading image maybe
})
.fail(function() {
// handle request failures
});
}
xhr_get('/index').done(function(data) {
// do stuff with index data
});
xhr_get('/id').done(function(data) {
// do stuff with id data
});
Manfaat penting dari ini dalam hal rawatan adalah bahwa Anda telah membungkus mekanisme ajax Anda dalam fungsi spesifik aplikasi. Jika Anda memutuskan bahwa Anda memerlukan $.ajax
panggilan Anda untuk beroperasi secara berbeda di masa depan, atau Anda menggunakan metode ajax yang berbeda, atau Anda menjauh dari jQuery, Anda hanya perlu mengubah xhr_get
definisi (pastikan untuk mengembalikan janji atau setidaknya done
metode, di kasus contoh di atas). Semua referensi lain di seluruh aplikasi dapat tetap sama.
Ada banyak lagi (jauh lebih keren) hal yang dapat Anda lakukan $.Deferred
, salah satunya adalah menggunakan pipe
untuk memicu kegagalan pada kesalahan yang dilaporkan oleh server, bahkan ketika $.ajax
permintaan itu sendiri berhasil. Sebagai contoh:
function xhr_get(url) {
return $.ajax({
url: url,
type: 'get',
dataType: 'json'
})
.pipe(function(data) {
return data.responseCode != 200 ?
$.Deferred().reject( data ) :
data;
})
.fail(function(data) {
if ( data.responseCode )
console.log( data.responseCode );
});
}
xhr_get('/index').done(function(data) {
// will not run if json returned from ajax has responseCode other than 200
});
Baca lebih lanjut di $.Deferred
sini: http://api.jquery.com/category/deferred-object/
CATATAN : Pada jQuery 1.8, pipe
telah tidak digunakan lagi karena menggunakan then
cara yang persis sama.
success:
/.done()
didefinisikan, jika sama sekali. Misalnyasuccess:
baru diimplementasikan sebagai yang pertama.done()
hari ini?success:
dan.done
melakukan panggilan ajax? Pertanyaan bagus. Karena semua panggilan balik lainnya dipanggil sesuai urutannya, tebakan saya adalah ya,success
baru dipanggil dulu.pipe
adalah salah satu di mana permintaan itu sendiri berhasil tetapi skrip di server tidak mengembalikan apa yang Anda cari. Anda mungkin tidak ingin membuang 404 atau 500 yang sebenarnya atau apa pun di sisi server karena Anda ingin membedakan antara respons http dan respons aplikasi secara bermakna. Mengatur kode respons di JSON dan kemudian menggunakanpipe
cara ini memungkinkan Anda menangani berbagai jenis kesalahan dengan lebih banyak nuansa.Jika Anda membutuhkan
async: false
di ajax Anda, Anda harus menggunakansuccess
bukan.done
. Lain Anda lebih baik menggunakan.done
. Ini dari situs resmi jQuery :sumber
async:false
?$.ajax({ url: req_url, ..., async: false, success: function (result, status, req) { }, error: function (jqXHR, status) { } });
Objek jqXHR dikembalikan pada
$.ajax()
saat jQuery 1.5 mengimplementasikan antarmuka Janji, memberi mereka semua properti, metode, dan perilaku Janji (lihat objek yang Ditangguhkan untuk informasi lebih lanjut). Metode-metode ini mengambil satu atau lebih argumen fungsi yang dipanggil ketika$.ajax()
permintaan berakhir. Ini memungkinkan Anda untuk menetapkan beberapa panggilan balik pada satu permintaan, dan bahkan untuk menetapkan panggilan balik setelah permintaan tersebut selesai. (Jika permintaan sudah selesai, callback dipecat segera.) Metode Janji yang tersedia dari objek jqXHR meliputi:Alternatif konstruksi untuk opsi callback sukses, lihat
deferred.done()
rincian implementasi.Alternatif konstruksi untuk opsi panggilan balik kesalahan,
.fail()
metode ini menggantikan metode .error () yang tidak digunakan lagi. Rujuk ke deferred.fail () untuk detail implementasi.(ditambahkan dalam jQuery 1.6) Sebuah konstruksi alternatif untuk opsi panggilan balik lengkap,
.always()
metode ini menggantikan metode yang tidak.complete()
digunakan lagi .Menanggapi permintaan yang berhasil, argumen fungsi adalah sama dengan argumen dari
.done()
: data, textStatus, dan objek jqXHR. Untuk permintaan yang gagal, argumennya sama dengan argumen dari.fail()
: objek jqXHR, textStatus, dan errorThrown. Lihatdeferred.always()
untuk detail implementasi.Menggabungkan fungsionalitas
.done()
dan.fail()
metode, memungkinkan (pada jQuery 1.8) Janji yang mendasarinya untuk dimanipulasi. Lihat ditangguhkan.then()
untuk detail implementasi.sumber