打破PrototypeJS .each()循环

时间:2009-06-25 18:21:20

标签: javascript prototypejs

在这个非常人为的例子中,我有一个包含3个元素的数组,我正在使用.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()循环?

4 个答案:

答案 0 :(得分:33)

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

在您链接的同一页面上记录了它。这是每个功能特别处理的异常。抛出时,它会阻止在其他元素上调用函数。

答案 1 :(得分:7)

你是对的,并且Prototype创建了一个对象( $ break ),可以从每个函数抛出该对象以启用此功能。根据Prototype API文档:

  

使用break和continue语句可以在JavaScript中将常规循环短路。但是,当使用迭代器函数时,您的代码不在循环范围内:循环代码发生在场景后面。

     

为了向您提供等效(尽管不太理想)的功能,Prototype提供了两个全局异常对象:$ break和$ continue。抛出这些等同于在vanilla循环中使用相应的本机语句。这些异常在每个方法内部正确捕获。

另请注意,$ continue对象已被弃用,并且要模拟 continue - 语句,请使用vanilla 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]

您可以在此处详细了解每项功能:http://www.prototypejs.org/api/enumerable/each

答案 2 :(得分:2)

根据您链接到的.each()文档,您应该使用throw $break;语句,这会导致进一步的迭代停止。

简单地返回将导致迭代器继续到下一个迭代器。

答案 3 :(得分:2)

从您链接到的页面,不是正确的方法

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