2009-06-25 11 views
16

W tym bardzo wymyślnym przykładzie mam tablicę z 3 elementami, które zapętlałem za pomocą metody .each().Wychodzenie z pętli PrototypeJS .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; 
    } 
    }); 

mogę łatwo powrócić z funkcji wywoływanej przez .each() jeśli muszę.

Moje pytanie brzmi, jak mogę wyrwać się z pętli .each() z funkcji, która wywołuje funkcja .each()?

Odpowiedz

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

Jest to udokumentowane na tej samej stronie, którą połączono. Jest to wyjątek specjalnie obsługiwany przez każdą funkcję. Po rzuceniu uniemożliwia wywoływanie funkcji na kolejnych elementach.

+1

Doh! Wygląda na to, że jest też "throw $ continue". –

+3

Jednak "throw $ continue" jest przestarzałe na rzecz zwykłego zwrotu. –

+1

Chcę zauważyć, że nowa strona z dokumentami nie ma tych informacji teraz – llamerr

7

Twoje dane są prawidłowe, a prototyp stworzył obiekt ($ break), który można wyrzucić z każdej funkcji, aby włączyć tę funkcję. Zgodnie z dokumentami Prototype API:

Zwykłe pętle mogą być zwarte w JavaScript przy użyciu instrukcji break i continue. Jednak przy korzystaniu z funkcji iteratora twój kod wykracza poza zakres pętli: kod pętli dzieje się za sceną.

Aby zapewnić równoważną (aczkolwiek mniej optymalną) funkcjonalność, Prototype udostępnia dwa globalne obiekty wyjątków: $ break i $ continue. Rzucanie ich jest równoważne użyciu odpowiedniej natywnej instrukcji w pętli waniliowej. Te wyjątki są prawidłowo wychwytywane wewnętrznie przez każdą metodę.

Należy również pamiętać, że $ kontynuować obiekt został przestarzałe i symulować kontynuować -statement, należy użyć instrukcji return zamiast wanilii. Przykładem

Kod:

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] 

można przeczytać więcej na temat każdego z funkcją tutaj: http://www.prototypejs.org/api/enumerable/each

+2

Jak już wspomniano, $ continue jest przestarzałe i raczej bezcelowe. Możesz po prostu wrócić. –

+0

Masz rację. Byłem zbyt szybki. Poprawione. – PatrikAkerstrand

2

podstawie dokumentacji .each() które związane, należy użyć throw $break; oświadczenie, powinno powodują zaprzestanie kolejnych iteracji.

Po prostu wróci spowoduje, że iterator przejdzie do następnego.

2

Od tej strony, związane, nie jest prawidłowy sposób

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

?

Powiązane problemy