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.