2009-06-25 8 views
16

In questo esempio molto forzato, ho un array con 3 elementi su cui sto eseguendo il ciclo usando il metodo .each().Rottura da un loop 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; 
    } 
    }); 

posso facilmente tornare fuori della funzione che viene chiamato da .each() se ne ho bisogno.

La mia domanda è, come posso uscire dal ciclo .each() dall'interno della funzione che .each() sta chiamando?

risposta

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

è documentato alla stessa pagina si è collegato. È un'eccezione gestita specificamente da ciascuna funzione. Quando viene lanciato, impedisce che la funzione venga richiamata da ulteriori elementi.

+1

Doh! Sembra che ci sia anche un "lancio di $ continua". –

+3

Tuttavia, "throw $ continue" è deprecato a favore di un semplice ritorno. –

+1

Desidero notare che la nuova pagina dei documenti non ha questa informazione ora – llamerr

7

Sono corretti e Prototype ha creato un oggetto ($ break) che può essere generato da ciascuna funzione per abilitare questa funzionalità. In base ai documenti dell'API Prototype:

I loop regolari possono essere cortocircuitati in JavaScript utilizzando le istruzioni break e continue. Tuttavia, quando si utilizzano le funzioni iteratore, il codice è al di fuori dell'ambito del ciclo: il codice di loop si verifica dietro la scena.

Al fine di fornire una funzionalità equivalente (anche se meno ottimale), Prototype fornisce due oggetti di eccezione globali, $ break e $ continua. Lanciare questi è equivalente all'utilizzo della corrispondente istruzione nativa in un ciclo di vaniglia. Queste eccezioni sono correttamente catturate internamente da ciascun metodo.

Si noti inoltre che il $ continuano oggetto è stato deprecato, e di simulare un continuano -affermazione, utilizzare un'istruzione di ritorno alla vaniglia, invece.

Codice esempio:

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] 

Si può leggere di più sul ciascuna funzione qui: http://www.prototypejs.org/api/enumerable/each

+2

Come notato qui, $ continue è deprecato e piuttosto inutile. Puoi solo tornare. –

+0

Sei corretto. Ero troppo veloce Corretto. – PatrikAkerstrand

2

Sulla base della documentazione per .each() che si è collegato a, si dovrebbe usare una dichiarazione throw $break;, questo dovrebbe causare ulteriori interruzioni delle iterazioni.

La semplice restituzione fa sì che l'iteratore continui a quello successivo.

2

Da quella pagina si è collegato al, non è il modo corretto

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

?