Dengan menggunakan jQuery, bagaimana saya bisa membatalkan / membatalkan permintaan Ajax yang belum saya terima jawabannya?
javascript
jquery
ajax
suam-suam kuku
sumber
sumber
$.ajaxStop
?ajaxStop
hanya mendeteksi ketika semua permintaan AJAX selesai, itu tidak menghentikan permintaan. Dalam pengalaman saya, Anda akan menggunakannya seperti ini:$(document).ajaxStop(function(){alert("All done")})
. Menggunakan.abort()
adalah pilihan terbaik.Jawaban:
Sebagian besar metode jQuery Ajax mengembalikan objek XMLHttpRequest (atau yang setara), jadi Anda bisa menggunakannya
abort()
.Lihat dokumentasi:
UPDATE: Pada jQuery 1.5 objek yang dikembalikan adalah pembungkus untuk objek XMLHttpRequest asli yang disebut jqXHR. Objek ini muncul untuk mengekspos semua properti dan metode asli sehingga contoh di atas masih berfungsi. Lihat Objek jqXHR (dokumentasi API jQuery).
UPDATE 2: Pada jQuery 3, metode ajax sekarang mengembalikan janji dengan metode tambahan (seperti batalkan), jadi kode di atas masih berfungsi, meskipun objek yang dikembalikan bukan
xhr
lagi. Lihat blog 3.0 di sini .UPDATE 3 :
xhr.abort()
masih berfungsi di jQuery 3.x. Jangan menganggap pembaruan 2 sudah benar. Info lebih lanjut tentang repositori jQuery Github .sumber
abort
tidak menutup koneksi yang ada dengan server, jadisuccess
masih akan dipanggil. Ini sangat bermasalah untuk implementasi Comet dengan polling yang panjang..abort()
masih bekerja untuk saya di jQuery 3.2.1. Komentar ini dalam masalah github terkait oleh anggota tim inti jQuery tampaknya menyiratkan bahwa jawaban ini salah dan.abort()
itu tidak dihapus.Anda tidak dapat mengingat permintaan tetapi Anda dapat menetapkan nilai batas waktu setelah mana tanggapan akan diabaikan. Lihat halaman ini untuk opsi jquery AJAX. Saya percaya bahwa panggilan balik kesalahan Anda akan dipanggil jika periode batas waktu terlampaui. Sudah ada batas waktu default pada setiap permintaan AJAX.
Anda juga dapat menggunakan batalkan () metode pada objek permintaan tapi, sementara itu akan menyebabkan klien untuk berhenti mendengarkan untuk acara tersebut, itu
mungkinmungkin tidak akan menghentikan server dari memprosesnya.sumber
Ini asinkron permintaan yang tidak , artinya setelah dikirim, itu ada.
Jika server Anda memulai operasi yang sangat mahal karena permintaan AJAX, yang terbaik yang dapat Anda lakukan adalah membuka server Anda untuk mendengarkan permintaan pembatalan, dan mengirim permintaan AJAX terpisah yang memberitahukan server untuk menghentikan apa pun yang dilakukannya.
Jika tidak, abaikan saja respons AJAX.
sumber
Simpan panggilan yang Anda lakukan dalam array, lalu panggil xhr.abort () di masing-masingnya.
CAVEAT BESAR: Anda dapat membatalkan permintaan, tetapi itu hanya sisi klien. Sisi server masih dapat memproses permintaan. Jika Anda menggunakan sesuatu seperti PHP atau ASP dengan data sesi, data sesi dikunci sampai ajax selesai. Jadi, agar pengguna dapat terus menjelajahi situs web, Anda harus menelepon session_write_close (). Ini menyimpan sesi dan membuka kunci sehingga halaman lain yang menunggu untuk melanjutkan akan dilanjutkan. Tanpa ini, beberapa halaman dapat menunggu kunci dihapus.
sumber
Permintaan AJAX mungkin tidak lengkap dalam urutan dimulai. Alih-alih membatalkan, Anda dapat memilih untuk mengabaikan semua respons AJAX kecuali yang paling baru:
Garis besar kode yang kasar:
Demo di jsFiddle
sumber
Kami hanya harus mengatasi masalah ini dan menguji tiga pendekatan yang berbeda.
Dalam kasus kami, kami memutuskan untuk menggunakan pendekatan # 3 karena menghasilkan lebih sedikit beban untuk server. Tapi saya tidak 100% yakin jika jQuery menjamin panggilan metode .complete () -, ini bisa menghasilkan situasi jalan buntu. Dalam pengujian kami, kami tidak dapat mereproduksi situasi seperti itu.
sumber
Itu selalu praktik terbaik untuk melakukan sesuatu seperti ini.
Tetapi jauh lebih baik jika Anda memeriksa pernyataan if untuk memeriksa apakah permintaan ajax adalah nol atau tidak.
sumber
Panggil saja xhr. batalkan () apakah itu objek jquery ajax atau objek XMLHTTPRequest asli.
contoh:
sumber
Saya sedang melakukan solusi pencarian langsung dan perlu membatalkan permintaan yang tertunda yang mungkin memakan waktu lebih lama dari permintaan terbaru / terbaru.
Dalam kasus saya, saya menggunakan sesuatu seperti ini:
sumber
Seperti yang dicatat oleh banyak orang di utas, hanya karena permintaan dibatalkan di sisi klien, server masih akan memproses permintaan tersebut. Ini menciptakan beban yang tidak perlu di server karena melakukan pekerjaan yang kami berhenti mendengarkan di front-end.
Masalah yang saya coba selesaikan (yang mungkin juga dijalankan oleh orang lain) adalah ketika pengguna memasukkan informasi dalam bidang input, saya ingin menjalankan permintaan untuk jenis nuansa Google Instan.
Untuk menghindari memecat permintaan yang tidak perlu dan untuk menjaga kenyamanan front-end, saya melakukan hal berikut:
Ini pada dasarnya akan mengirim satu permintaan setiap 150ms (variabel yang dapat Anda sesuaikan untuk kebutuhan Anda sendiri). Jika Anda mengalami kesulitan memahami apa yang sebenarnya terjadi di sini, log
xhrCount
danxhrQueue
ke konsol sebelum jika blok.sumber
Cukup gunakan ajax.abort () misalnya Anda dapat membatalkan permintaan ajax yang tertunda sebelum mengirim yang lain seperti ini
sumber
Anda dapat membatalkan panggilan ajax berkelanjutan dengan menggunakan ini
sumber
tidak ada cara yang dapat diandalkan untuk melakukannya, dan saya bahkan tidak akan mencobanya, begitu permintaan sedang berjalan; satu - satunya cara untuk bereaksi secara wajar adalah dengan mengabaikan respons.
dalam kebanyakan kasus, itu dapat terjadi dalam situasi seperti: pengguna mengklik terlalu sering pada tombol yang memicu banyak XHR berturut-turut, di sini Anda memiliki banyak pilihan, baik memblokir tombol sampai XHR dikembalikan, atau bahkan tidak memicu XHR baru sementara yang lain sedang menjalankan petunjuk pengguna untuk bersandar - atau membuang respons XHR yang tertunda kecuali yang terbaru.
sumber
Kode berikut menunjukkan memulai serta membatalkan permintaan Ajax:
sumber
Saya memiliki masalah pemungutan suara dan setelah halaman ditutup, pemungutan suara berlanjut sehingga karena saya pengguna akan melewatkan pembaruan karena nilai mysql sedang ditetapkan untuk 50 detik berikutnya setelah penutupan halaman, meskipun saya membunuh permintaan ajax, saya mencari tahu, menggunakan $ _SESSION untuk menetapkan var tidak akan memperbarui dalam polling sendiri sampai berakhir dan yang baru telah dimulai, jadi apa yang saya lakukan adalah menetapkan nilai dalam database saya sebagai 0 = offpage, sementara saya polling, saya query baris itu dan mengembalikan false; saat ini 0 karena kueri dalam polling akan memberi Anda nilai saat ini jelas ...
Saya harap ini membantu
sumber
Jika
xhr.abort();
menyebabkan pemuatan ulang halaman,Kemudian Anda dapat mengatur
onreadystatechange
sebelum batal untuk mencegah:sumber
Saya telah membagikan demo yang menunjukkan cara membatalkan permintaan AJAX - jika data tidak dikembalikan dari server dalam waktu tunggu yang telah ditentukan.
HTML:
KODE JS:
sumber
$.ajax
menyediakantimeout
opsi sehingga Anda tidak perlu menulis sendiri. Cukup gunakan..., data: {...}, timeout: waitTime,...
.