Breaking out of a PrototypeJS .each() loop

前端 未结 4 1290
难免孤独
难免孤独 2021-02-05 09:52

In this very contrived example, I have an array with 3 elements that I\'m looping over using the .each() method.

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

vals.each( func         


        
相关标签:
4条回答
  • 2021-02-05 10:32

    Your are correct, and Prototype has created an object ($break) that can be thrown from the each-function to enable this functionality. According to the Prototype API docs:

    Regular loops can be short-circuited in JavaScript using the break and continue statements. However, when using iterator functions, your code is outside of the loop scope: the looping code happens behind the scene.

    In order to provide you with equivalent (albeit less optimal) functionality, Prototype provides two global exception objects, $break and $continue. Throwing these is equivalent to using the corresponding native statement in a vanilla loop. These exceptions are properly caught internally by the each method.

    Also, note that the $continue object has been deprecated, and to simulate a continue-statement, use a vanilla return statement instead.

    Code example:

    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]
    

    You can read more about the each-function here: http://www.prototypejs.org/api/enumerable/each

    0 讨论(0)
  • 2021-02-05 10:37
    if( val == 'bar' ) {
        throw $break;
    }
    

    It's documented at the same page you linked. It's an exception specially handled by the each function. When thrown, it prevents your function from being called on further elements.

    0 讨论(0)
  • 2021-02-05 10:42

    Based on the documentation for .each() that you linked to, you should use a throw $break; statement, this should cause further iterations to cease.

    Simply returning will cause the iterator to continue to the next one.

    0 讨论(0)
  • 2021-02-05 10:56

    From that page you linked to, isn't the correct way

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

    ?

    0 讨论(0)
提交回复
热议问题