pertimbangkan skenario ini untuk memvalidasi:
function validateForm (validCallback) {
$('#first-name').add($('#last-name')).add($('#address')).each(function () {
// validating fields and adding 'invalid' class to invalid fields.
});
// doing validation this way for almost 50 fields (loop over 50 fields)
if ($('#holder .invalid').length == 0) {
// submitting data here, only when all fields are validated.
}
}
Sekarang, masalah saya adalah, jika blok dijalankan sebelum loop selesai. Saya berharap tubuh validateForm
dieksekusi secara sinkron, tetapi tampaknya each()
fungsi jQuery dijalankan secara tidak sinkron. Apakah saya benar? Kenapa ini tidak berhasil?
jquery
asynchronous
Saeed Neamati
sumber
sumber
each
sinkron, tetapi kode di dalamnya mungkin tidak ...each
itu sendiri diproses secara serempak. Apakah Anda memulai operasi async Anda sendiri dari dalam loop?Jawaban:
Ya,
each
metode jQuery sinkron. Hampir SEMUA JavaScript bersinkronisasi. Satu-satunya pengecualian adalah AJAX, timer (setTimeout
dansetInterval
), dan Pekerja Web HTML5.Masalah Anda mungkin ada di tempat lain dalam kode Anda.
sumber
jQuery
adalah murni perpustakaan javascript. Kecualiajax
,setTimeout
dansetInterval
tidak ada yang dapat dijalankan secara asinkronJavaScript
. Jadieach
pasti dijalankan secara serempak. Pasti ada beberapa kesalahan js di dalameach
kode blok. Anda harus melihat di konsol untuk setiap kesalahan.Atau Anda dapat melihat antrian jQuery untuk menjalankan fungsi apa pun dalam antrian. Ini akan memastikan fungsi yang antri akan dieksekusi hanya ketika eksekusi kode sebelumnya selesai.
sumber
Alasan lain untuk mengajukan pertanyaan itu adalah .each hanya akan menghentikan iterasi ketika fungsi (.each ()) mengembalikan false, dan variabel tambahan harus digunakan untuk meneruskan informasi "return false".
sumber
Bagi saya itu berfungsi seperti asinkron. Jika berhasil disinkronkan, mengapa itu berfungsi seperti itu:
sumber
return false
dalam.each()
fungsi istirahat hanya loop, dan kode yang tersisa di luar loop masih dijalankan. Jadi atur flag dalam.each()
lingkaran dan periksa di luar loop.sumber
Permasalahan yang sama. Jadi saya perbaiki seperti ini
sumber
Begitulah cara saya melakukannya
sumber
Saya memiliki masalah yang sama. $ .each saya ada di dalam fungsi keberhasilan panggilan ajax. saya membuat panggilan ajax saya sinkron dengan menambahkan
async: false
dan itu berhasil.sumber
Metode jQuery.each loop secara sinkron, tetapi Anda tidak dapat menjamin bahwa itu akan melewati item dalam urutan tertentu.
sumber