Saya memiliki permintaan AJAX yang akan dibuat setiap 5 detik. Tetapi masalahnya adalah sebelum permintaan AJAX jika permintaan sebelumnya tidak selesai, saya harus membatalkan permintaan itu dan membuat permintaan baru.
Kode saya kira-kira seperti ini, bagaimana mengatasi masalah ini?
$(document).ready(
var fn = function(){
$.ajax({
url: 'ajax/progress.ftl',
success: function(data) {
//do something
}
});
};
var interval = setInterval(fn, 500);
);
Jawaban:
Metode jquery ajax mengembalikan objek XMLHttpRequest . Anda dapat menggunakan objek ini untuk membatalkan permintaan.
XMLHttpRequest memiliki metode batalkan , yang membatalkan permintaan, tetapi jika permintaan telah dikirim ke server maka server akan memproses permintaan bahkan jika kami membatalkan permintaan tetapi klien tidak akan menunggu / menangani respons.
Objek xhr juga berisi readyState yang berisi keadaan permintaan (UNSENT-0, OPENED-1, HEADERS_RECEIVED-2, LOADING-3 dan DONE-4). kita dapat menggunakan ini untuk memeriksa apakah permintaan sebelumnya selesai.
sumber
readystate
atas dan direadyState
bawah, karakters
dikapitalisasi dalam jQuery 1.5if (xhr) xhr.abort();
akan bekerja dengan baik juga.readystate
dalam dokumentasinya. Itu selalu dikapitalisasireadyState
dan jquery (sebelum atau sesudah 1,5) benar sesuai dengan spesifikasi w3.Saat Anda membuat permintaan ke server, minta ia memeriksa untuk melihat apakah suatu kemajuan bukanlah nol (atau mengambil data itu) terlebih dahulu. Jika mengambil data, batalkan permintaan sebelumnya dan mulai yang baru.
sumber
Saya tahu ini mungkin sedikit terlambat tetapi saya mengalami masalah serupa di mana memanggil metode abort tidak benar-benar membatalkan permintaan. alih-alih, peramban masih menunggu respons yang tidak pernah digunakan. kode ini menyelesaikan masalah itu.
sumber
Mengapa Anda harus membatalkan permintaan?
Jika setiap permintaan membutuhkan waktu lebih dari lima detik, apa yang akan terjadi?
Anda tidak boleh membatalkan permintaan jika parameter yang lewat dengan permintaan tidak berubah. misalnya: - permintaan untuk mengambil data notifikasi. Dalam situasi seperti itu, Pendekatan yang bagus adalah menetapkan permintaan baru hanya setelah menyelesaikan permintaan Ajax sebelumnya.
sumber
Anda dapat menggunakan jquery-validate.js. Berikut ini adalah cuplikan kode dari jquery-validate.js.
Sehingga Anda hanya perlu mengatur mode parameter untuk dibatalkan ketika Anda membuat permintaan ajax.
Ref: https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.14.0/jquery.validate.js
sumber
jQuery: Gunakan ini sebagai titik awal - sebagai inspirasi. Saya memecahkannya seperti ini: (ini bukan solusi yang sempurna, itu hanya membatalkan contoh terakhir dan kode WIP)
sumber
Buat fungsi untuk memanggil API Anda. Dalam fungsi ini kami mendefinisikan permintaan
callApiRequest = $.get(...
- meskipun ini adalah definisi dari suatu variabel, permintaan tersebut dipanggil segera, tetapi sekarang kami memiliki permintaan yang didefinisikan sebagai variabel. Sebelum permintaan dipanggil, kami memeriksa apakah variabel kami ditentukantypeof(callApiRequest) != 'undefined'
dan juga jika sedang menunggusuggestCategoryRequest.state() == 'pending'
- jika keduanya benar, kami.abort()
permintaan yang akan mencegah keberhasilan callback berjalan.Server / API Anda mungkin tidak mendukung membatalkan permintaan (bagaimana jika API sudah mengeksekusi beberapa kode?), Tetapi panggilan balik javascript tidak akan diaktifkan. Ini berguna, ketika misalnya Anda memberikan saran input kepada pengguna, seperti input hashtag.
Anda selanjutnya dapat memperluas fungsi ini dengan menambahkan definisi panggilan balik kesalahan - apa yang harus terjadi jika permintaan dibatalkan.
Kasing penggunaan umum untuk cuplikan ini adalah input teks yang diaktifkan saat
keypress
acara. Anda dapat menggunakan batas waktu, untuk mencegah pengiriman (sebagian) permintaan yang harus Anda batalkan.abort()
.sumber
Anda juga harus memeriksa readyState 0. Karena ketika Anda menggunakan xhr.abort () fungsi ini mengatur readyState ke 0 pada objek ini, dan centang if Anda akan selalu benar - readyState! = 4
sumber