2011-08-02 13 views
2

jQueryのeach()関数は非ブロック化ですか?jQuery each()non-blocking?

以下の例では、「each in test」が最初にログに記録されることを期待していますが、「test out of each」が最初に記録されます。

これは、エラーを返す前に、ループが本文(ドキュメントもあります)要素まで実行されているためです。

私は、共通の親をラップするか、2つの要素(firstpとlastp)が兄弟である場合は、それらをラップします。

しかし、each()関数のパフォーマンスとノンブロッキングかどうかは、ほとんど気になります。

while(firstp[0] !== lastp[0]){ 
     //If parents are siblings, this will do for wrapping. 
     var isS = false; 
      firstp.siblings().each(function(index, el){ 
       console.log("test in each"); 
       if(jQuery(el)[0] === lastp[0]){ 
        isS = true; 
        return true; 
       } 
      }); 
      console.log("test out of each"); 
     if(isS === true){ break; } 
     firstp = firstp.parent(); 
     lastp = lastp.parent(); 
    } 

EDIT:

申し訳ありませんが、みんな。これは誤った警告だった。ポールは正しい。私のHTMLには実際にfirstpにマッチした2つの要素がありました。私はこれを理解していないので、最初の人は兄弟を持っていないので、エラーが発生します。私はいつも第二の要素を見ていました。

しかし、私はその過程で何かを学んだので、答える時間をとってくれてありがとう。

+0

あなたはまた、コンソールにログインし、「各テスト」を参照してくださいか? – ShankarSangoli

+0

@Shankarはい、両方のテキストが記録されていますが、私が期待する順序ではありません。おそらく私は何かが明らかに欠けているでしょう。 –

+0

@Senica:コンソールのログメッセージがテキストに明らかな関係を示さないときに、「注文」についてアサーションを行うことはできないと思います。メッセージは外部ループ内の異なる反復から印刷され、あなたは決して知りませんでした。 –

答えて

3

.each()は同期です。

whileループの最初の繰り返しでは、firstpには兄弟はありません。そのため、それぞれが反復処理するオブジェクトは空であり、「それぞれからテスト」が最初に記録されます。それから、2回目の繰り返しでfirstpに兄弟姉妹があるので、それぞれの兄弟に入り、 "それぞれのテスト"の後に "それぞれのテスト"が表示されます。

私はあなたのコードは、このようなものに変更した場合は、コンソールから適切な行動を参照してくださいと思いますので、あなたはループが上にある反復のかを見ることができます。

var i = 1; 
while(firstp[0] !== lastp[0]){ 
     //If parents are siblings, this will do for wrapping. 

     var isS = false; 
      firstp.siblings().each(function(index, el){ 
       console.log(i+": test in each ("+index+")"); 
       if(jQuery(el)[0] === lastp[0]){ 
        isS = true; 
        return true; 
       } 
      }); 
      console.log(i+": test out of each")); 
      i++; 
     if(isS === true){ break; } 
     firstp = firstp.parent(); 
     lastp = lastp.parent(); 
} 
+0

申し訳ありません。これは誤った警告だった。ポールは正しい。私のHTMLには実際にfirstpにマッチした2つの要素がありました。私はこれを知らなかったので、最初の人は兄弟を持っていませんでした。私はいつも第二の要素を見ていました。 –

3

「ノンブロッキング」とはどういう意味ですか? Javascriptは通常1つのスレッドで実行されるため、すべてがブロックされています。 (XMLHttpRequestsはブラウザの別の部分に渡され、カウントされません)イベント/アニメーションキューはわずかに変化します(コールバック呼び出しはユーザー指定の文の順序と切り離されています)が、どちらも有効ではありませんここに。

each()コールに続くコードが呼び出される前に、選択した要素が必ずしもすべて処理されないように非同期で実行するかどうかを確認する場合は、答えは「いいえ」にする必要があります。

これはあなたが見ている結果を説明していません。おそらく、ネストされたループがあるので、コンソールのログ項目を間違って解釈している可能性があります。コンソールログメッセージに反復カウンタを追加することをお勧めします。

1

whileループがfirstp.siblings()を開始したとき、私は思います空であり、"test out of each"を記録してからfirstPfirstp.parent();に設定すると、内部メッセージが記録されるような結果が出る可能性があります。デバッグして、最初の繰り返しで何が得られるかを確認してください。

1

return trueを実行すると、eachの繰り返しから抜け出すのですか?もしそうなら、それはreturn falseであると考えられます。 return trueは効果がないと私は信じている。

さらに、あなたはおそらくこのような何かにあなたのコードを変更することができます:「各のうちテストは、」ログに記録されている場合

while(firstp[0] !== lastp[0]){ 
    //If parents are siblings, this will do for wrapping. 
    var isS = false; 
     firstp.siblings().each(function(index, el){ 
      console.log("test in each"); 
      isS = jQuery(el)[0] === lastp[0]; 
      return isS; 
     }); 
     console.log("test out of each"); 
    if(isS === true){ break; } 
    firstp = firstp.parent(); 
    lastp = lastp.parent(); 
} 
+0

あなたは正しいです、私はそこに真実を返すことを意味しなかった、私は偽を意味しました。 –