Ausbrechen eines PrototypeJS .each () -Schleife

stimmen
16

In diesem sehr contrived Beispiel habe ich ein Array mit 3 Elementen , die über I mit der Looping bin .each () Methode.

 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;
    }
  });

Ich kann leicht Rückkehr aus der Funktion aufgerufen wird .each () , wenn ich muss.

Meine Frage ist, wie kann ich brechen aus dem .each () Schleife aus dem Inneren der Funktion , die .each () aufgerufen wird?

Veröffentlicht am 25/06/2009 um 17:21
quelle vom benutzer
In anderen Sprachen...                            


4 antworten

stimmen
32

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

Es ist auf der gleichen Seite, die Sie verknüpft dokumentiert. Es ist eine Ausnahme speziell durch die einzelnen Funktionen behandelt. Wenn geworfen, verhindert, dass es Ihre Funktion auf weitere Elemente genannt zu werden.

Beantwortet am 25/06/2009 um 17:25
quelle vom benutzer

stimmen
7

Sie sind richtig, und Prototype hat ein Objekt (erstellt $ Pause ) , die von der jeweiligen Funktions geworfen werden kann diese Funktionalität zu aktivieren. Nach dem Prototyp API - Dokumentation:

Regelmäßige Schleifen können kurzgeschlossen in JavaScript, die Pause und solange Aussagen. Wenn jedoch Iterator-Funktionen verwendet, ist Ihr Code außerhalb der Schleife -umfang: der Looping-Code geschieht hinter den Kulissen.

Um Ihnen Äquivalent (wenn auch weniger optimal) Funktionalität bereitzustellen, bietet Prototype zwei globale Ausnahmeobjekte, $ break und continue $. Diese werfen ist äquivalent die entsprechende nativen Anweisung in einer Schleife zu verwenden Vanille. Diese Ausnahmen werden richtig intern durch die einzelnen Methoden gefangen.

Beachten Sie auch, dass das Objekt $ weiterhin ist veraltet, und zu simulieren weiterhin -Anweisung, eine Vanille-return - Anweisung stattdessen verwenden.

Code-Beispiel:

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]

Sie können hier mehr über die einzelnen Funktions lesen: http://www.prototypejs.org/api/enumerable/each

Beantwortet am 25/06/2009 um 17:26
quelle vom benutzer

stimmen
2

Auf der Grundlage der Dokumentation , .each()die Sie verknüpfen, Sie verwenden sollen throw $break;Anweisung, sollte dies dazu führen , weitere Iterationen zu beenden.

Einfach Rückkehr der Iterator zum nächsten weiter verursachen.

Beantwortet am 25/06/2009 um 17:26
quelle vom benutzer

stimmen
2

Von dieser Seite, die Sie verbunden sind, ist nicht der richtige Weg

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

?

Beantwortet am 25/06/2009 um 17:26
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more