2009-06-25 12 views
16

この非常にわかりやすい例では、私は.each()メソッドを使ってループしている3つの要素を持つ配列を持っています。PrototypeJS .each()ループの中断

var vals = $w('foo bar baz'); 

vals.each(function(val) { 
    alert(val); 

    if(val == 'bar') { 
     //This exits function(val) 
     //but still continues with the .each() 
     return; 
    } 
    }); 

私がする必要がある場合、私は簡単に.each()によって呼び出される関数の外に返すことができます。

私の質問は、.each()が呼び出す関数の中から.each()ループを抜け出すにはどうすればよいですか?

答えて

32
if(val == 'bar') { 
    throw $break; 
} 

リンク先と同じページに記載されています。これは、特に各関数で処理される例外です。スローされると、それはあなたの関数がさらなる要素に対して呼び出されるのを防ぎます。

+1

Doh! "$ continueを投げる"ようにも見えます。 –

+3

しかし、 "throw $ continue"は単純なリターンのために廃止予定です。 –

+1

新しい文書ページにこの情報がないことに注意してください。 – llamerr

7

あなたの問題は正しいです。Prototypeは、この機能を有効にするために各機能からスローされるオブジェクト($ break)を作成しました。 Prototype APIドキュメントによると:

通常のループは、breakステートメントとcontinueステートメントを使用してJavaScriptで短絡させることができます。しかし、反復子関数を使用する場合、コードはループスコープの外側にあります。ループするコードはシーンの背後で発生します。

Prototypeには、(最適ではありませんが)同等の機能を提供するために、2つのグローバル例外オブジェクト$ breakと$ continueが用意されています。これらを投げることは、対応するネイティブ・ステートメントをバニラ・ループで使用することと同じです。これらの例外は、各メソッドによって内部的に適切に捕捉されます。

はまた、$オブジェクトが推奨されていません続け、 -statementを続けるシミュレートするために、代わりにバニラreturnステートメントを使用することに注意してください。

コード例:

var result = []; 
$R(1,10).each(function(n) { 
    if (0 == n % 2) 
    return; // this equals continue 
    if (n > 6) 
    throw $break; 
    result.push(n); 
}); 
// result -> [1, 3, 5] 

あなたはここで、各機能についての詳細を読むことができます:あなたは、あなたがこれがすべき、throw $break;ステートメントを使用する必要がありますにリンク.each()のドキュメントに基づいてhttp://www.prototypejs.org/api/enumerable/each

+2

ここに記載されているように、$ continueは廃止予定で、無意味です。あなたはちょうど戻ることができます。 –

+0

あなたは正しいです。私は速すぎました。修正されました。 – PatrikAkerstrand

2

をさらなる反復を停止させる。

単に返すと、イテレータは次のイテレータに移ります。あなたがリンクされ、そのページから、

2

は、正しい方法

if(val == 'bar') 
{ 
    throw $break; 
} 

ではないでしょうか?