2011-09-10 7 views
111

を検証するために、このシナリオを考えてみます。jQueryの "e​​ach()"関数は同期していますか?

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ワーカーです。
問題はおそらくあなたのコードのどこかにあります。

-8

jQuery.eachメソッドは同期的にループしますが、特定の順序で項目をループすることは保証できません。

+18

いいえ、ドキュメントに表示されている順序でループします。 – Abraham

+2

これは、反復処理の対象によって異なります。それぞれは、配列に対するインデックス順の実行を保証しますが、オブジェクトを保証するものではありません(明白でなければなりません)。 – Deadron

6

jQueryは、純粋にjavascriptライブラリです。 ajaxsetTimeoutsetInterval以外は、JavaScriptで非同期に実行できるものはありません。したがって、eachは確実に同期して実行されます。ブロックコードeachの中に間違いなくいくつかのjsエラーがあります。コンソールにエラーがないかどうか調べてください。

また、jQuery queueを見て、キュー内の任意の機能を実行することもできます。これにより、直前のコードの実行が完了したときにのみ、キューに入れられた関数が実行されるようになります。

+7

約束もあります。ちょうど:) – iwayneo

4

もう1つの理由は、.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

同じ問題。だから、私はそれが

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

ザッツのように修正します。それが同期で動作する場合、そのように動作する理由:

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

それはasyncronousのように動作します私のために行う方法この

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

} 
関連する問題