Quiero algo como esto en javascript.

for (i = 0; i < 10; i++) {
    alert(i);
    // now sleep 1 sec
    sleep(1000);
}

¿Hay un Javascript incorporado o Jquery para esto?

¡Gracias!

6
Flueras Bogdan 14 ago. 2009 a las 14:10

7 respuestas

La mejor respuesta

No existe tal cosa, directamente. Tendría que decirle a JavaScript que active "algo" después de algún tiempo usando setTimeout.

Este 'algo' sería el código que planea ejecutar después de el sueño, por supuesto.

De un ejemplo que encontré en internet:

function dothingswithsleep( part ) {
    if( part == 0 ) {
        alert( "before sleep" );
        setTimeout( function() { dothingswithsleep( 1 ); }, 1000 );
    } else if( part == 1 ) {
        alert( "after sleep" );
    }
}

Pero ese es un diseño frágil. Es mejor repensar su lógica de negocios para realmente hacer algo después de un segundo: llamar a una función diferente en lugar de usar estas variables auxiliares artificiales.

5
xtofl 14 ago. 2009 a las 10:26
function sleep(delay) { 
    var start = new Date().getTime(); 
    while (new Date().getTime() < start + delay); 
} 
0
Brandon 18 ene. 2012 a las 20:43

Bueno, si tiene PHP instalado en el servidor web, puede usar $.load o similar para llamar a un archivo PHP que solo tiene sleep(int) en él ...

0
Carlos Nunez 28 jun. 2011 a las 15:22

Vi este comentario "He intentado usar setTimeout, pero NO necesito una función de continuación" y pensé que sí. Lo que no necesitas es un bucle. Necesitas una función recursiva.

ESTA

for (i = 0; i < 10; i++) {
    alert(i);
    // now sleep 1 sec
    sleep(1000);
}

Se traduce a este

function recursive( i, max )
{
    if ( i > max ) return;
    alert( i );
    i = i + 1;
    setTimeout( function(){ recursive(i, max); }, 1000 );
}

recursive(1, 10);

Ejemplo: http://jsfiddle.net/q76Qa/

1
Bradley 12 dic. 2013 a las 22:00

He buscado / buscado en Google bastantes páginas web en Javascript sleep / wait ... y NO hay respuesta si desea que JavaScript "EJECUTE, RETARDE, EJECUTE" ... lo que la mayoría de la gente obtuvo fue "EJECUTAR, EJECUTAR (inútil cosas), RUN "o" RUN, RUN + RUN retrasado "....

Así que comí algunas hamburguesas y pensé ::: aquí hay una solución que funciona ... pero tienes que cortar tus códigos de ejecución ... :::

//......................................... //Ejemplo 1:

<html>
<body>
<div id="id1">DISPLAY</div>

<script>
//javascript sleep by "therealdealsince1982"; copyrighted 2009
//setInterval
var i = 0;

function run() {
    //pieces of codes to run
    if (i==0){document.getElementById("id1").innerHTML= "<p>code segment "+ i +" is ran</p>"; }
    if (i==1){document.getElementById("id1").innerHTML= "<p>code segment "+ i +" is ran</p>"; }
    if (i==2){document.getElementById("id1").innerHTML= "<p>code segment "+ i +" is ran</p>"; }
    if (i >2){document.getElementById("id1").innerHTML= "<p>code segment "+ i +" is ran</p>"; }
    if (i==5){document.getElementById("id1").innerHTML= "<p>all code segment finished running</p>"; clearInterval(t); } //end interval, stops run
    i++; //segment of code finished running, next...
}

t=setInterval("run()",1000);

</script>
</body>
</html>

// .................................... // ejemplo2:

<html>
<body>
<div id="id1">DISPLAY</div>

<script>
//javascript sleep by "therealdealsince1982"; copyrighted 2009
//setTimeout
var i = 0;

function run() {
    //pieces of codes to run, can use switch statement
    if (i==0){document.getElementById("id1").innerHTML= "<p>code segment "+ i +" ran</p>"; sleep(1000);}
    if (i==1){document.getElementById("id1").innerHTML= "<p>code segment "+ i +" ran</p>"; sleep(2000);}
    if (i==2){document.getElementById("id1").innerHTML= "<p>code segment "+ i +" ran</p>"; sleep(3000);}
    if (i==3){document.getElementById("id1").innerHTML= "<p>code segment "+ i +" ran</p>";} //stops automatically
    i++;
}

function sleep(dur) {t=setTimeout("run()",dur);} //starts flow control again after dur

run(); //starts flow
</script>
</body>
</html>
2
user207408 10 nov. 2009 a las 06:01

Primera pregunta, ¿por qué quieres dormir en un bucle? Si esto es necesario, tal vez debería establecerse un sistema de eventos. Yo mismo he intentado la táctica del sueño muchas veces para la programación de JavaScript multiproceso y descubrí que no funciona bien. La mejor manera de realizar subprocesos múltiples en javascript es utilizar un sistema de eventos como el proporcionado por YUI o casi cualquier otro marco. Haga que su oyente se suscriba a este evento y haga algo cada vez que ocurra. En estos marcos de eventos usted tiene control total de cuándo se dispara su propio evento personalizado, por lo que no es gran cosa.

Aquí está el enlace para el marco de eventos de YUI.

http://developer.yahoo.com/yui/examples/event/index.html

Así es como podría codificarse usando YUI

var myEvent = new YAHOO.util.CustomEvent('fooEvent');
// subscribe a function to be called (first param) inside the scope of an object
// (second param).
myEvent.subscribe(function() {alert(this.count++);},{count:0},true);
setTimeout('myEvent.fire()',1000);

Esa forma de hacerlo es mucho más limpia y compacta. O si no quieres usar un marco de eventos prueba esto

var myObj = {
    count:0,
    doSomething:function(){alert(this.count++);}
    loopFunc:function(){
        this.doSomething();
        setTimeout('myObj.loopFunc()',1000);
    }
}

Eso ofrece lo que necesita, y es más compacto.

Pero si REALMENTE debe tener una función de suspensión en su código, entonces recomendaría realizar una llamada síncrona ajax a un simple script del lado del servidor. Luego puede usar el código en el servidor para dormir si lo desea. A continuación hay un enlace a una pregunta publicada aquí que le muestra cómo hacer una llamada sincrónica.

¿Cómo puedo hacer que jQuery realice una solicitud Ajax sincrónica, en lugar de asincrónica?

Pero te recomiendo que vayas por el camino setTimeout. Mucho más limpio, y probablemente no quieras hacer ninguna llamada en el servidor si puedes evitarlo.

2
Community 23 may. 2017 a las 11:53

Uso

setTimeout

Método

5
rahul 14 ago. 2009 a las 10:13