2010-12-28 45 views
19

Me gustaría crear una pausa dentro de un loop while para que pueda crear n animaciones que aparecen 3 segundos después de la otra.Crear una pausa dentro de un ciclo while en javascript

He intentado lo siguiente, pero no funciona. Me encantaría que alguien me muestre lo que estoy haciendo mal. ¡¡Gracias!!

i=0; 
while (i < n) { 
    someanimation(); 
    setTimeout(function(){ 
     i++; 
    }, 3000); 

}; 

Respuesta

34

setTimeout no se detenga; le pide a Javascript que ejecute algún otro código más tarde.

Google para "setTimeout loop" le dice exactamente lo que necesita saber. Si observa un poco, incluso menciona setInterval. La diferencia: usar setTimeout en loop esperará 3 segundos entre bucles, mientras que setInterval hará que tome 3 segundos en total para el bucle (incluyendo el tiempo que demore la animación, siempre que sea menos de 3 segundos :)). Además, setInterval construye un ciclo infinito del que tendrá que salir después del número deseado de veces; setTimeout requiere que construyas el loop tú mismo.

i = 0; 

function animation_loop() { 
    someAnimation(); 
    setTimeout(function() { 
    i++; 
    if (i < n) { 
     animation_loop(); 
    } 
    }, 3000); 
}; 
animation_loop(); 

i = 0; 
someAnimation(); 
setInterval(function() { 
    i++; 
    if (i < n) { 
    someAnimation(); 
    } 
}, 3000); 
+5

¡rock! muchas gracias, soy un verdadero principiante, así que no estoy familiarizado con las expresiones idiomáticas y no siempre sé cuáles son las mejores palabras clave para google. De todos modos, ¡realmente me desbloqueaste a lo grande! – djianp

+0

Brillante! El ciclo 'setTimeout' es una buena idea: D –

1

usted no es muy específico sobre lo que quiere hacer, pero yo diría que el principal problema es que llame someanimation() sin demora. Así que tal vez esto lo resuelve para usted:

for (var i = 0; i < n; i++) { 
    setTimeout(someanimation, 3000 * i); 
}; 

Nota la falta () después someanimation ya que es la devolución de llamada para setTimeout().

+0

Por favor, no reinventar algo para lo cual existen modismos estándar. –

+0

@Karl Knechtel: ¿de qué estás hablando? ¿Qué "modismos estándar"? La tuya es la misma idea. La única diferencia es que inicia la siguiente llamada a 'someanimation()' en la función del temporizador. – sjngm

+0

"... inicia la siguiente llamada a alguna animación() en la función del temporizador". Eso es exactamente lo que es el modismo estándar. De esta forma, solo una devolución de llamada se pone en cola a la vez. –

-1

crear una función como:

function sleep_until (seconds) { 
    var max_sec = new Date().getTime(); 
    while (new Date() < max_sec + seconds * 1000) {} 
    return true; 
} 

y luego cambiar el código para

i=0; 
while (i < n) { 
    someanimation(); 
    sleep_until(3); 
    do_someotheranimation(); 
}; 
+7

de ninguna manera. Que while-loop bloquea el motor de JavaScript – sjngm

+1

bloqueando el js fue precisamente lo que estaba buscando. –

+0

A veces quieres bloquear el motor ... (con suerte solo para probarlo) –

7

setTimeout es un poco más complicado que eso, porque no bloquea (es decir, que no termina de espera en el tiempo de espera antes de continuar con el programa).

Lo que queremos es más cercano a esto:

var i = 0; 
function nextFrame() { 
    if(i < n) { 
     someanimation(); 
     i++; 
     // Continue the loop in 3s 
     setTimeout(nextFrame, 3000); 
    } 
} 
// Start the loop 
setTimeout(nextFrame, 0); 

También puede ser que valga la pena leer sobre setInterval como una posible alternativa.

0
function myFunction() { 
    var x; 
for(var i=0;i<10;i++){ 
    if (confirm("Press a button!") == true) { 
     x = "You pressed OK!"; 
    } else { 
     x = "You pressed Cancel!"; 
    } 
    document.getElementById("demo").innerHTML = x; 
} 
}`` 
2

Una de las maneras de hacerlo es utilizar RxJS. Por favor, eche un vistazo a working example here

Rx.Observable 
    .interval(1000) 
    .take(10) 
    .subscribe((x) => console.log(x)) 
Cuestiones relacionadas