apa perbedaan antara metode sukses dan .done () dari $ .ajax


102

Ada yang bisa bantu saya?
Saya tidak dapat memahami perbedaan antara successdan .done()dari $.ajax.

Jika memungkinkan tolong beri contoh.


di mana Anda membaca tentang metode done () dari $ .ajax ()? AFAIK metode selesai terkait dengan objek $ .Deferred. Mungkin Anda berbicara tentang .complete ()?
Fabrizio Calderan


2
ok, ini jQuery 1.8 :) Karena $ .ajax mengembalikan janji dari jQuery 1.5 ini adalah substitusi sederhana untuk masalah konsistensi (menggunakan antarmuka deferred): done () menggantikan keberhasilan (), gagal () untuk kesalahan () dan selalu () untuk menyelesaikan ()
Fabrizio Calderan

2
Perubahan sebenarnya adalah Anda dapat melampirkan banyak panggilan balik secara terprogram. Lihat halaman dokumentasi $ .Deferred.
Fabrizio Calderan

Jawaban:


8

Singkatnya, memisahkan fungsi callback yang berhasil dari fungsi ajax sehingga nanti Anda dapat menambahkan penangan Anda sendiri tanpa mengubah kode asli (pola pengamat).

Temukan informasi lebih rinci dari sini: https://stackoverflow.com/a/14754681/1049184


1
Dan di bawahnya contoh memetakan kesetaraan selesai => sukses, gagal => kesalahan dan selalu => selesai
StuartLC

25
Jawaban ini melenceng. Ada perbedaan antara success: digunakan sebagai parameter dan .success()sebagai metode pada jqXHR. Yang terakhir sudah tidak digunakan lagi, tapi yang pertama adalah pertanyaan OP.
Alnitak

2
Sukses / kesalahan / selesai tidak digunakan lagi dan berdasarkan perubahan status AJAX; selesai / gagal / selalu didasarkan pada perubahan status jQuery Deferred. Lihat api.jquery.com/category/deferred-object .
mickeyreiss

28
saya tidak percaya jawaban yang salah menafsirkan pertanyaan adalah solusi yang dipilih dan diterima tertinggi ...
Transcendence

108

successhanya aktif jika panggilan AJAX berhasil, yaitu pada akhirnya mengembalikan status HTTP 200. erroraktif jika gagal dan completesaat permintaan selesai, terlepas dari keberhasilannya.

Di jQuery 1.8 pada jqXHRobjek (dikembalikan oleh $.ajax) successdiganti dengan done, errordengan faildan completedengan always.

Namun Anda masih bisa menginisialisasi permintaan AJAX dengan sintaks lama. Jadi ini melakukan hal serupa:

// set success action before making the request
$.ajax({
  url: '...',
  success: function(){
    alert('AJAX successful');
  }
});

// set success action just after starting the request
var jqxhr = $.ajax( "..." )
  .done(function() { alert("success"); });

Perubahan ini untuk kompatibilitas dengan objek yang ditangguhkan jQuery 1.5 . Deferred (dan sekarang Promise, yang memiliki dukungan browser asli penuh di Chrome dan FX) memungkinkan Anda untuk melakukan tindakan asinkron:

$.ajax("parent").
    done(function(p) { return $.ajax("child/" + p.id); }).
    done(someOtherDeferredFunction).
    done(function(c) { alert("success: " + c.name); });

Rantai fungsi ini lebih mudah dikelola daripada piramida callback bersarang yang Anda dapatkan success.

Namun, harap diperhatikan bahwa donesekarang sudah tidak digunakan lagi karena mendukung Promisesintaks yang menggunakan then:

$.ajax("parent").
    then(function(p) { return $.ajax("child/" + p.id); }).
    then(someOtherDeferredFunction).
    then(function(c) { alert("success: " + c.name); }).
    catch(function(err) { alert("error: " + err.message); });

Ini layak diadopsi karena asyncdan awaitmemperpanjang janji meningkatkan sintaksis (dan penanganan kesalahan):

try {
    var p = await $.ajax("parent");
    var x = await $.ajax("child/" + p.id);
    var c = await someOtherDeferredFunction(x);
    alert("success: " + c.name);
}
catch(err) { 
    alert("error: " + err.message); 
}

pembuatan fungsi sebelum membuat permintaan, dan mengatur fungsi setelah membuat permintaan. Sepertinya keduanya sama ... maukah Anda menunjukkan perbedaan lain ???
suhailvs

@suhail - sebenarnya tidak ada; di jQuery 1.6 ada success, di jQuery 1.8 sudah diganti dengan done. Mereka bekerja dengan cara yang sama, tetapi donelebih konsisten dengan jQuery lainnya.
Keith

@Keith jadi hari ini, menggunakan. Lakukan sama dengan menggunakan kesuksesan? atau ada hal lain yang lebih baru?
Roxy'Pro

@ Roxy'Pro ini sudah ketinggalan zaman ketika saya menjawabnya, saya pasti tidak akan menggunakan ini pada tahun 2018. .doneadalah tusukan awal jQuery (dan sekarang buntu) pada apa yang menjadi Promisedan yang sekarang memiliki dukungan bahasa yang cukup komprehensif. Dalam proyek baru, saya akan menggunakan const response = await fetch(...)sebagai gantinya.
Keith

6

.success() hanya dipanggil jika server web Anda merespons dengan header HTTP 200 OK - pada dasarnya saat semuanya baik-baik saja.

Callback yang dilampirkan ke done () akan diaktifkan saat penangguhan diselesaikan. Callback yang dilampirkan ke fail () akan diaktifkan saat penangguhan ditolak.

promise.done(doneCallback).fail(failCallback)

.done() has only one callback and it is the success callback

3
Perlu dicatat bahwa .success () TIDAK dipanggil ketika format JSON yang salah dikirim kembali dengan kode status 200 / OK. Secara khusus, saya mengalami masalah dengan kode backend server web yang menghasilkan nilai NaN dan membuat serialisasi sebagai NaN javascript (yaitu sebagai simbol, bukan string 'NaN') yang sebenarnya bukan JSON yang valid - jadi parsing respons sebagai JSON gagal dan .fail () dijalankan, tetapi status responsnya 200. Tetapi masih benar bahwa HANYA yang berhasil dipanggil dengan kode status OK; hanya ingin menunjukkan bahwa hanya karena tidak apa-apa, bukan berarti 'berhasil';)
Kasapo

1

successadalah callback yang dipanggil saat permintaan berhasil dan merupakan bagian dari $.ajaxpanggilan. donesebenarnya adalah bagian dari jqXHRobjek yang dikembalikan oleh $.ajax(), dan menggantikan successdi jQuery 1.8.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.