Kode semu:
$(document).ajaxError(function(e, xhr, options, error) {
xhr.retry()
})
Yang lebih baik lagi adalah semacam kemunduran eksponensial
javascript
jquery
ajax
xmlhttprequest
Tom Lehman
sumber
sumber
tries
, dan jika gagal, Anda memanggil fungsi dengantries+1
. Hentikan eksekusi padatries==3
atau nomor lain.Jawaban:
Sesuatu seperti ini:
sumber
.success
dilampirkan untuk memanggil fungsi yang mengembalikan permintaan ajax ini?tryCount
danretryLimit
berlebihan. Pertimbangkan untuk menggunakan hanya 1 variabel:this.retryLimit--; if (this.retryLimit) { ... $.ajax(this) ... }
Salah satu pendekatannya adalah dengan menggunakan fungsi pembungkus:
Pendekatan lain akan menggunakan
retries
properti di$.ajax
Cara lain ( GIST ) - timpa yang asli
$.ajax
(lebih baik untuk KERING)Hal yang perlu dipertimbangkan adalah memastikan bahwa
$.ajax
metode tersebut belum digabungkan sebelumnya, untuk menghindari kode yang sama berjalan dua kali.Anda dapat menyalin-tempel cuplikan ini (sebagaimana adanya) ke konsol untuk mengujinya
sumber
Saya telah banyak sukses dengan kode di bawah ini (contoh: http://jsfiddle.net/uZSFK/ )
sumber
Tak satu pun dari jawaban ini berfungsi jika seseorang menelepon
.done()
setelah panggilan ajax mereka karena Anda tidak akan memiliki metode yang berhasil untuk dilampirkan ke panggilan balik di masa mendatang. Jadi jika seseorang melakukan ini:Maka
mySuccessFunc
tidak akan dipanggil saat coba lagi. Inilah solusi saya, yang banyak dipinjam dari jawaban @ cjpak di sini . Dalam kasus saya, saya ingin mencoba lagi ketika AWS's API Gateway merespons dengan kesalahan 502.Cuplikan ini akan mundur dan mencoba lagi setelah 2 detik, lalu 5 detik, lalu 10 detik, yang dapat Anda edit dengan mengubah konstanta RETRY_WAIT.
Dukungan AWS menyarankan agar kami menambahkan percobaan ulang, karena ini hanya terjadi sekali di bulan biru.
sumber
Berikut adalah plugin kecil untuk ini:
https://github.com/execjosh/jquery-ajax-retry
Batas waktu penambahan otomatis akan menjadi tambahan yang bagus untuk itu.
Untuk menggunakannya secara global cukup buat fungsi Anda sendiri dengan tanda tangan $ .ajax, gunakan di sana coba lagi api dan ganti semua panggilan $ .ajax Anda dengan fungsi baru Anda.
Anda juga dapat langsung mengganti $ .ajax, tetapi Anda tidak akan dapat melakukan panggilan xhr tanpa mencoba lagi.
sumber
Inilah metode yang berfungsi untuk saya untuk pemuatan pustaka asinkron:
Kemudian cukup panggil
.load_script
dari aplikasi Anda dan tingkatkan panggilan balik sukses Anda:sumber
Jawaban DemoUsers tidak berfungsi dengan Zepto, karena ini dalam fungsi kesalahan mengarah ke Window. (Dan cara menggunakan 'ini' tidak cukup aman karena Anda tidak tahu bagaimana mereka mengimplementasikan ajax atau tidak perlu.)
Untuk Zepto, mungkin Anda bisa mencoba di bawah ini, sampai sekarang ini berfungsi dengan baik untuk saya:
Gunakan konstruktor untuk memastikan permintaan reentrant!
sumber
Kode Anda hampir penuh :)
sumber