2011-04-09 15 views
15

Tratando de pensar en Javascript en lugar de jQuery, entonces me pregunto si estoy haciendo esto bien.Javascript para la devolución de llamada de bucle?

Quiero tener una devolución de llamada cuando termine mi ciclo. ¿Es esta la manera correcta?

for(var i = 0; i < divs.length; i++) { 

    /* do some stuff */ 

    if (i === (divs.length - 1)) { /* call back */ } 

} 

debo añadir que no me refiero a algo así como una solicitud de devolución de llamada JSON, justo cuando el bucle ha finalizado.

+5

Disculpe mi ignorancia, pero no lo entiendo. Si desea llamarlo cuando termine el ciclo, ¿por qué no llama ** después de ** el ciclo en lugar de hacerlo dentro? – Aleadam

+0

Si va a pensar en JavaScript, hágalo. Haga su ciclo, luego llame a su función. – JAAulde

Respuesta

18

¿Por qué no dice lo que realmente quiere decir y llama a la devolución de llamada después de el bucle?

function thing_with_callback(divs, callback) { 
    for(var i = 0; i < divs.length; i++) { 
     /* do some stuff */ 
    } 
    callback(); 
} 
+1

porque eso sería ridículo. Además, ¿y si quisieras editarlo interactivamente en un depurador? –

+0

Técnicamente, eso no es equivalente si la matriz está vacía ya que todavía se ejecutará. Sin embargo, es fácil evitar una declaración if. –

+0

@Matthew: La pregunta era "Quiero tener una devolución de llamada cuando mi ciclo haya terminado". así que poner la 'callback();' fuera del bucle es la única manera y no hay necesidad de un condicional en 'divs.length'. –

20

Para mayor claridad, hay que ir con la respuesta de @ mu, pero si realmente necesidad incluir la devolución de llamada dentro de la for constructo, se puede utilizar el operador coma *:

for(var i = 0; 
    i < divs.length || function(){ /* call back */ }(), false; 
    i++) { 

/* do some stuff */ 

} 

* Como explicado en this fascinating article.

+0

+1 para ese artículo! – Will

8

Solo para que la respuesta de codelahoma sea más simple, puede devolver directamente false de su función de devolución de llamada. (Para evitar volver a ejecutar el código del bucle, una vez más)

for(var i = 0;i < divs.length || function(){ /* callback */ return false;}();i++){ 
/* loop code */ 
} 
+0

Mi ejemplo no realiza una evaluación de bucle adicional. El operador ',' evalúa ambos operandos y devuelve el resultado del que está a la derecha. Ahora noté que estaba usando una expresión en el RHS que siempre será falsa, y he editado para reflejar eso. – codelahoma

+0

Usa ediciones en lugar de nuevas respuestas si estás agregando. – haykam

5

Me parece que la pregunta es acerca de la orden de ejecución de código JavaScript. Y las respuestas son:

sí se puede poner la devolución de llamada fuera porque código javascript es línea ejecutada por la línea. En caso de llamadas asynchonous ajax puede haber otras cosas a considerar.

Cuestiones relacionadas