跳出PrototypeJS的.each()循环

17
在这个非常假设的例子中,我有一个包含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个回答

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

这在你链接的同一页有记录。它是each函数特别处理的异常。当抛出时,它会阻止对更多元素调用你的函数。


1
糟糕!看起来也有一个“throw $continue”。 - Mark Biek
3
然而,“throw $continue” 已经被弃用,建议使用简单的“return”语句。 - Joel Mueller
1
我想指出新的文档页面现在没有这个信息。 - llamerr

7
你是正确的,Prototype创建了一个对象($break),可以从each函数中抛出以启用此功能。根据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]

您可以在此处了解有关each函数的更多信息:http://www.prototypejs.org/api/enumerable/each


2
正如所述,$continue已经被弃用而且毫无意义。您可以直接使用return。 - Matthew Flaschen

2

根据你提供的 .each() 文档,你应该使用 throw $break; 语句,这将导致后续迭代停止。

仅仅返回结果将会让迭代器继续到下一个迭代。


2
从您提供的页面来看,这不是正确的方法。
 if(val == 'bar')
 {
    throw $break;
 }

?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接