Подтвердить что ты не робот

Вывод из цикла PrototypeJS.each()

В этом очень надуманном примере у меня есть массив с тремя элементами, которые я перебираю с помощью метода . 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()?

4b9b3361

Ответ 1

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

Он задокументирован на той же странице, с которой вы связались. Это исключение, специально обработанное каждой функцией. При броске он не позволяет вашей функции вызываться на других элементах.

Ответ 2

Вы правы, и Prototype создал объект ($break), который может быть сброшен из каждой функции, чтобы включить эту функцию. В соответствии с документами Prototype API:

Регулярные циклы могут быть закорочены в JavaScript с использованием операторов break и continue. Однако при использовании функций итератора ваш код выходит за пределы области цикла: код цикла происходит за сценой.

Чтобы предоставить вам эквивалентную (хотя и менее оптимальную) функциональность, Prototype предоставляет два глобальных объекта исключения, $break и $continue. Выбрасывание их эквивалентно использованию соответствующего нативного оператора в петле ванили. Эти исключения должным образом пойманы внутри каждого метода.

Кроме того, обратите внимание, что объект $continue устарел, и для имитации оператора continue вместо него используйте оператор 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

Ответ 3

На основе документации для .each(), с которой вы связались, вы должны использовать оператор throw $break;, это должно привести к прекращению итераций.

Простое возвращение приведет к тому, что итератор продолжит переход к следующему.

Ответ 4

С той страницы, с которой вы связались, не является правильным способом

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

?