在这个非常人为的例子中,我有一个包含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()循环?
答案 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;
}