2011-09-10 62 views
111

考慮這種情況下,用於驗證:jQuery「each()」函數是否同步?

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

現在,我的問題是,在循環結束前,如果塊得到執行。我預計validateForm的主體將被同步執行,但似乎jQuery each()函數被異步執行。我對嗎?爲什麼這不起作用?

+2

驗證代碼是什麼樣的? 'each'是同步的,但是裏面的代碼可能不是... – lonesomeday

+1

'each'本身是同步處理的。你是從循環內開始進行一些自己的異步操作嗎? – Jon

+3

這裏有類似的問題..你是怎麼解決的? – sakthig

回答

134

是的,jQuery each方法是同步的。幾乎所有的JavaScript都是同步的。唯一的例外是AJAX,定時器(setTimeoutsetInterval)以及HTML5 Web Workers。
你的問題可能在你的代碼中的其他地方。

-8

jQuery.each方法循環同步,但不能保證它會以任何特定的順序遍歷項目。

+18

不,它會按照它們在文檔中出現的順序遍歷它們。 – Abraham

+2

這取決於你正在迭代。每個保證數組上的索引順序執行,但不保證對象(這應該是顯而易見的)。 – Deadron

6

jQuery純粹是一個javascript庫。 ajax,setTimeoutsetIntervalJavaScript以外沒有任何東西可以異步執行。所以each肯定是同步執行的。 each塊代碼中肯定存在一些js錯誤。你應該看看控制檯中是否有任何錯誤。

另外,你可以看看jQuery queue執行隊列中的任何功能。這將確保排隊功能只有在前面的代碼執行完成時纔會執行。

+7

還有承諾...只是說:) – iwayneo

4

問這個問題的另一個原因是,每當(.each())函數返回false時,每個函數都會停止迭代,並且必須使用附加變量來傳遞「返回false」信息。

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'); 
} 
0

同樣的問題。所以我修復此類

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

那我怎麼辦呢

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

對我來說,它就像asyncronous。如果它同步,爲什麼它的工作原理是這樣的:

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 
});