Bagaimana cara membuat fungsi menunggu sampai semua permintaan jQuery Ajax dilakukan di dalam fungsi lain?
Singkatnya, saya harus menunggu semua permintaan Ajax selesai sebelum saya menjalankan selanjutnya. Tapi bagaimana caranya?
javascript
jquery
ajax
jamietelin
sumber
sumber
Jawaban:
jQuery sekarang mendefinisikan fungsi when untuk tujuan ini.
Ia menerima sejumlah objek yang ditangguhkan sebagai argumen, dan menjalankan fungsi ketika semuanya diselesaikan.
Itu berarti, jika Anda ingin memulai (misalnya) empat permintaan ajax, kemudian melakukan tindakan ketika selesai, Anda dapat melakukan sesuatu seperti ini:
Menurut pendapat saya, itu membuat sintaksis yang bersih dan jelas, dan menghindari melibatkan variabel global seperti ajaxStart dan ajaxStop, yang bisa memiliki efek samping yang tidak diinginkan saat halaman Anda berkembang.
Jika Anda tidak tahu sebelumnya berapa banyak argumen ajax yang harus Anda tunggu (yaitu Anda ingin menggunakan sejumlah variabel argumen), itu masih bisa dilakukan tetapi hanya sedikit lebih rumit. Lihat Menyerahkan array dari Ditangguhkan ke $ .when () (dan mungkin jQuery .when memecahkan masalah dengan jumlah variabel argumen ).
Jika Anda memerlukan kontrol lebih dalam atas mode kegagalan skrip ajax dll., Anda dapat menyimpan objek yang dikembalikan oleh
.when()
- itu adalah objek jQuery Promise yang mencakup semua kueri ajax asli. Anda dapat memanggil.then()
atau.fail()
menambahkannya ke penangan sukses / kegagalan yang terperinci.sumber
$.when
mengembalikanPromise
objek yang memiliki metode yang lebih bermanfaat, tidak hanya.done
. Misalnya, dengan.then(onSuccess, onFailure)
metode Anda dapat bereaksi ketika kedua permintaan berhasil atau setidaknya salah satu dari mereka gagal.fail
kopernya. Tidak sepertidone
,fail
kebakaran segera pada kegagalan pertama dan mengabaikan sisa tangguhan.onFailure
fungsi dapat dilampirkan. Seperti yang saya tunjukkan dalam komentar pada pertanyaan OP: dia mungkin ingin menunjukkan lebih tepatnya apa yang dia maksud dengan "selesai". "Ryan Mohr" juga memiliki poin yang sangat bagus mengenai fakta yangfail
berperilaku berbedadone
, beberapa bacaan lebih lanjut harus dilakukanPromises
saya kira html5rocks.com/en/tutorials/es6/promisesJika Anda ingin tahu kapan semua
ajax
permintaan selesai di dokumen Anda, tidak peduli berapa banyak dari mereka ada, cukup gunakan $ .ajaxStop acara dengan cara ini:Pembaruan:
Jika Anda ingin tetap menggunakan
ES
sintaks, maka Anda dapat menggunakan Promise.all untukajax
metode yang diketahui :Hal yang menarik di sini adalah bahwa ia berfungsi baik dengan
Promises
dan$.ajax
meminta.Ini adalah demonstrasi jsFiddle .
Pembaruan 2:
Namun versi yang lebih baru menggunakan async / menunggu sintaks :
sumber
Saya menemukan jawaban yang bagus oleh gnarf diri saya yang persis seperti yang saya cari :)
jQuery ajaxQueue
Kemudian Anda dapat menambahkan permintaan ajax ke antrian seperti ini:
sumber
Gunakan
ajaxStop
acara tersebut.Sebagai contoh, katakanlah Anda memiliki pesan memuat ... sambil mengambil 100 permintaan ajax dan Anda ingin menyembunyikan pesan itu sekali dimuat.
Dari dokumen jQuery :
Perhatikan bahwa itu akan menunggu semua permintaan ajax dilakukan pada halaman itu.
sumber
CATATAN: Jawaban di atas menggunakan fungsionalitas yang tidak ada pada saat jawaban ini ditulis. Saya merekomendasikan penggunaan
jQuery.when()
daripada pendekatan ini, tetapi saya meninggalkan jawaban untuk tujuan historis.-
Anda mungkin bisa bertahan dengan semaphore penghitungan sederhana, meskipun bagaimana Anda menerapkannya akan tergantung pada kode Anda. Contoh sederhana akan menjadi seperti ...
Jika Anda ingin ini beroperasi seperti {async: false} tetapi Anda tidak ingin mengunci browser, Anda bisa melakukan hal yang sama dengan antrian jQuery.
sumber
.get()
. Dengan begitu setidaknya Anda tidak menggandakan kode itu. Tidak hanya itu tetapi menyatakanfunction(){}
setiap waktu mengalokasikan memori setiap kali! Agak praktik yang buruk jika Anda bisa memanggil fungsi yang ditentukan secara statis.javascript berbasis acara, jadi Anda tidak boleh menunggu , lebih baik mengatur kait / panggilan balik
Anda mungkin bisa menggunakan metode sukses / lengkap dari jquery.ajax
Atau Anda bisa menggunakan .ajaxComplete :
meskipun Anda harus memposting kode semu tentang bagaimana permintaan ajax Anda dipanggil lebih tepat ...
sumber
Solusi kecil adalah sesuatu seperti ini:
Semoga bisa bermanfaat ...
sumber
jQuery memungkinkan Anda menentukan apakah Anda ingin permintaan ajax tidak sinkron atau tidak. Anda cukup membuat ajax permintaan sinkron dan kemudian sisa kode tidak akan dijalankan sampai mereka kembali.
Sebagai contoh:
sumber
Jika Anda membutuhkan sesuatu yang sederhana; sekali dan dilakukan panggilan balik
sumber
Anda juga dapat menggunakan async.js .
Saya pikir ini lebih baik daripada $ .Ketika karena Anda dapat menggabungkan semua jenis panggilan asinkron yang tidak mendukung janji di luar kotak seperti batas waktu, panggilan SqlLite dll, dan bukan hanya permintaan ajax.
sumber
Atas dasar jawaban @BBonifield, saya menulis fungsi utilitas sehingga logika semaphore tidak menyebar di semua panggilan ajax.
untilAjax
adalah fungsi utilitas yang memanggil fungsi panggilan balik ketika semua panggilan ajax selesai.ajaxObjs
adalah array dari objek pengaturan ajax[http://api.jquery.com/jQuery.ajax/]
.fn
adalah fungsi callbackContoh:
doSomething
fungsi menggunakanuntilAjax
.sumber
Saya sangat merekomendasikan menggunakan $ .when () jika Anda memulai dari awal.
Meskipun pertanyaan ini memiliki lebih dari jutaan jawaban, saya masih tidak menemukan sesuatu yang berguna untuk kasus saya. Katakanlah Anda harus berurusan dengan basis kode yang ada, sudah melakukan beberapa panggilan ajax dan tidak ingin memperkenalkan kompleksitas janji dan / atau mengulang semuanya.
Kita dapat dengan mudah memanfaatkan jQuery
.data
,.on
dan.trigger
fungsi yang telah menjadi bagian dari jQuery sejak selamanya.Codepen
Hal baik tentang solusi saya adalah:
sudah jelas apa yang sebenarnya bergantung pada callback
fungsi
triggerNowOrOnLoaded
tidak peduli jika data telah dimuat atau kami masih menunggu untuk itusangat mudah untuk menghubungkannya ke kode yang sudah ada
sumber
Saya menggunakan pemeriksaan ukuran ketika semua beban ajax selesai
sumber
Untuk memperluas jawaban Alex, saya punya contoh dengan argumen dan janji variabel. Saya ingin memuat gambar melalui ajax dan menampilkannya di halaman setelah semuanya dimuat.
Untuk melakukan itu, saya menggunakan yang berikut:
Diperbarui untuk bekerja baik untuk url tunggal atau ganda: https://jsfiddle.net/euypj5w9/
sumber
Seperti jawaban lain yang disebutkan, Anda dapat menggunakan
ajaxStop()
untuk menunggu sampai semua permintaan ajax selesai.Jika Anda ingin melakukannya untuk
ajax()
permintaan tertentu , yang terbaik yang dapat Anda lakukan adalah menggunakancomplete()
metode di dalam permintaan ajax tertentu:Tapi, jika Anda hanya perlu menunggu beberapa permintaan ajax dan pasti dilakukan? Gunakan janji javascript yang luar biasa untuk menunggu sampai ajax yang ingin Anda tunggu selesai. Saya membuat contoh singkat, mudah dan mudah dibaca untuk menunjukkan kepada Anda bagaimana cara kerja janji dengan ajax.
Silakan lihat contoh berikut . Saya biasa
setTimeout
mengklarifikasi contoh.sumber
Saya menemukan cara sederhana, menggunakan
shift()
sumber
Solusi saya adalah sebagai berikut
Bekerja dengan cukup baik. Saya sudah mencoba banyak cara berbeda untuk melakukan ini, tetapi saya menemukan ini sebagai yang paling sederhana dan paling dapat digunakan kembali. Semoga ini bisa membantu
sumber
Lihatlah solusi saya:
1. Masukkan fungsi ini (dan variabel) ke file javascript Anda:
2. Buat array dengan permintaan Anda, seperti ini:
3.Create fungsi callback:
4. Panggil fungsi runFunctionQueue dengan parameter:
sumber
$.when
tidak berfungsi untuk saya,callback(x)
alih-alihreturn x
berfungsi seperti yang dijelaskan di sini: https://stackoverflow.com/a/13455253/10357604sumber
Coba dengan cara ini. buat loop di dalam fungsi skrip java untuk menunggu sampai panggilan ajax selesai.
sumber
setTimeout()
TIDAKtake a sleep
. Dalam hal ini, Anda hanya memblokir semua tab hinggadone
menjadi benar.done
tidak akan pernah benar ketika loop sementara masih berjalan. Jika loop sementara sedang berjalan, loop peristiwa tidak dapat dilanjutkan dan oleh karena itu tidak akan pernah menjalankan panggilan balik ke keberhasilan ajax.