打破PrototypeJS .each()循环

Mar*_*iek 17 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;
    }
  });
Run Code Online (Sandbox Code Playgroud)

如果需要,我可以轻松地退出.each()调用的函数.

我的问题是,如何从.each()调用的函数内部中断出.each()循环?

Mat*_*hen 33

if( val == 'bar' ) {
    throw $break;
}
Run Code Online (Sandbox Code Playgroud)

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

  • 但是,"抛出$ continue"已被弃用,以支持简单的退货. (3认同)

Pat*_*and 7

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

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

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

另请注意,$ continue对象已被弃用,要模拟continue -statement,请改用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]
Run Code Online (Sandbox Code Playgroud)

您可以在这里阅读有关每个功能的更多信息:http://www.prototypejs.org/api/enumerable/each

  • 如前所述,$ continue被弃用,而且毫无意义.你可以回来. (2认同)