2009-06-25 12 views
16

En este ejemplo muy artificial, tengo una matriz con 3 elementos que estoy recorriendo utilizando el método .each().Rompiendo un bucle de 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; 
    } 
    }); 

que pueda volver fácilmente de la función que está siendo llamado por each() si necesito.

Mi pregunta es, ¿cómo puedo salir del bucle .each() desde dentro de la función que .each() está llamando?

Respuesta

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

Está documentado en la misma página que ha vinculado. Es una excepción manejada especialmente por cada función. Cuando se lanza, impide que su función sea invocada en otros elementos.

+1

Doh! Parece que hay un "lanzamiento $ continue" también. –

+3

Sin embargo, "throw $ continue" está en desuso en favor de una devolución simple. –

+1

Quiero señalar que la nueva página de documentos no tiene esta información ahora – llamerr

7

Tiene razón, y Prototype ha creado un objeto ($ break) que puede arrojarse desde cada función para habilitar esta funcionalidad. De acuerdo con los documentos Prototype API:

Los bucles normales se pueden cortocircuitar en JavaScript con las instrucciones break y continue. Sin embargo, al usar funciones de iterador, su código está fuera del alcance del bucle: el código de bucle ocurre detrás de la escena.

Para proporcionarle una funcionalidad equivalente (aunque menos óptima), Prototype proporciona dos objetos de excepción globales, $ break y $ continue. Lanzar estos es equivalente a usar la declaración nativa correspondiente en un bucle vainilla. Estas excepciones están apropiadamente atrapadas internamente por cada método.

Además, tenga en cuenta que los $ continúan objeto ya no se utiliza, y para simular un continuar -statement, utilice una instrucción de retorno de vainilla en su lugar.

Código ejemplo:

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] 

Usted puede leer más sobre el cada función aquí: http://www.prototypejs.org/api/enumerable/each

+2

Como se señaló allí, $ continuar está en desuso y bastante inútil. Puedes simplemente regresar. –

+0

Estás en lo correcto. Fui demasiado rápido. Corregido – PatrikAkerstrand

2

Sobre la base de la documentación de .each() que haya vinculado a, se debe utilizar una declaración throw $break;, esto debería causa que cesen más iteraciones.

El simple hecho de devolver hará que el iterador continúe con el siguiente.

2

Desde esa página se ha vinculado a, no es la forma correcta

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

?

Cuestiones relacionadas