JQuery "each ()" işlevi eşzamanlı mı?


133

doğrulamak için bu senaryoyu düşünün:

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.
   }
}

Şimdi, benim sorunum, if bloğunun döngüler bitmeden çalıştırılmasıdır. Gövdenin validateFormeşzamanlı olarak çalıştırılmasını bekliyordum, ancak jQuery each()işlevi eşzamansız olarak çalıştırılıyor gibi görünüyor . Haklı mıyım Bu neden çalışmıyor?


2
Doğrulama kodu neye benziyor? eacheşzamanlıdır, ancak içindeki kod ...
lonesomeday

1
eachkendisi eşzamanlı olarak işlenir. Döngünün içinden kendi zaman uyumsuz bir işleme mi başlıyorsunuz?
Jon

3
Buradaki benzer problem .. nasıl çözdünüz?
sakthig

Uzun zaman önceydi, hatırlayamıyorum. Ama cevapların bana yardımcı olduğunu biliyorum. Dolayısıyla, doğrulama kodumda eşzamansız kod blokları kullanmış olabilirim (bir ajax isteği kullanarak adresi doğrulamaya çalışmak gibi).
Saeed Neamati

1
hmm .. bu şekilde çözdüm .. çalışmayan her fonksiyonun içinde "yanlış dönüş" yapıyordum sanırım .. şimdi bu her fonksiyonun içinde bir bayrak
tutuyorum

Yanıtlar:


159

Evet, jQuery eachyöntemi eşzamanlıdır. Neredeyse TÜM JavaScript eşzamanlıdır. Tek istisnalar AJAX, zamanlayıcılar ( setTimeoutve setInterval) ve HTML5 Web Çalışanlarıdır.
Sorununuz muhtemelen kodunuzun başka bir yerindedir.


7

jQuerytamamen bir javascript kitaplığıdır. Hariç ajax, setTimeoutve setIntervaluyumsuz idam bir şey yoktur JavaScript. Bu yüzden eachkesinlikle eşzamanlı olarak yürütülür. eachBlok kodunun içinde kesinlikle bazı js hatası var . Herhangi bir hata için konsola bir göz atmalısınız.

Alternatif olarak, kuyruktaki herhangi bir işlevi yürütmek için jQuery kuyruğuna bir göz atabilirsiniz . Bu, sıraya alınmış işlevin yalnızca önceki kod yürütme tamamlandığında yürütüleceğinden emin olacaktır.


7
sözler de var ... sadece :)

6

Bu soruyu sormanın bir başka nedeni de, .each'in (.each ()) işlevi false döndürdüğünde yinelemeyi basitçe durdurması ve "dönüş yanlış" bilgisini geçirmek için ek bir değişken kullanılması gerektiğidir.

var all_ok=true;
$(selector).each(function(){
    if(!validate($(this))){
        all_ok=false; //this tells the outside world something went wrong
        return false; //this breaks the .each iterations, returning early
    }
});
if(!all_ok){
    alert('something went wrong');
}

2

Benim için asenkron gibi çalışıyor. Senkronizasyon çalışıyorsa, neden böyle çalışıyor:

var newArray = [];
$.each( oldArray, function (index, value){
        if($.inArray(value["field"], field) === -1){
            newArray.push(value["field"]);
        }
    }
);

//do something with newArray here doesn't work, newArray is not full yet

$.when.apply($, newArray).then(function() {
    //do something with newArray works!! here is full
});

2

return falsein .each()işlevi yalnızca döngüyü keser ve döngünün dışında kalan kod hala yürütülür. Bu yüzden .each()döngüde bir bayrak ayarlayın ve döngünün dışında kontrol edin.


1

Aynı sorun. Ben de böyle düzeltirim

var y = jQuery(this).find(".extra_fields");
for(var j in y)
{
    if( typeof  y[j] =='object')
    {
        var check = parseInt(jQuery(y[j]).val());
        if(check==0){
            jQuery(y[j]).addClass('js_warning');
            mes="Bạn vui lòng chọn đầy đủ các thuộc tính cho sản phẩm";
            done=false;
            eDialog.alert(mes);
            return false;
        }
    }

}

1

Ben böyle yaparım

 function getAllEventsIndexFromId(id) {
    var a;
    $.each(allEvents, function(i, val) {
        if (val.id == id) { a=i; }
    });
    return a;
 }

0

Ben de aynı sorunu yaşadım. benim $ .each ajax çağrısının başarı fonksiyonunun içindeydi. ajax çağrımı ekleyerek eşzamanlı yaptım async: falseve işe yaradı.


-9

JQuery.each yöntemi Eşzamanlı olarak döngüye girer, ancak öğeler arasında belirli bir sırada döneceğini garanti edemezsiniz.


21
Hayır, her zaman belgede göründükleri sırayla bunların üzerinden geçecektir.
İbrahim

3
Bu, neyi yinelediğinize bağlıdır. Her biri bir dizide dizin sırasının yürütülmesini garanti eder, ancak bir nesne için hiçbir garanti vermez (bu açık olmalıdır).
Deadron
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.