¿Cómo crear una pausa o un retraso en el bucle FOR?

4 minutos de lectura

avatar de usuario de jams
Enjambres

Estoy trabajando en un sitio web, donde necesito crear una pausa o un retraso.
Por favor, dígame cómo crear una pausa o un retraso en for incluyete javascript o jQuery

Este es un ejemplo de prueba

 var s = document.getElementById("div1");
 for (i = 0; i < 10; i++) {
     s.innerHTML = s.innerHTML + i.toString();
     //create a pause of 2 seconds.
  }

  • No puede “pausar” JavaScript en un navegador web. Sin embargo, puede configurar temporizadores y hacer que el código se ejecute en un momento posterior con el setTimeout() y setInterval() API disponibles en todos los navegadores.

    – Puntiagudo

    7 abr 2012 a las 22:06

  • tldr: debe convertir el código en un estilo recursivo de paso de continuación si desea aprovechar la asincronía. (Bueno, eso o usar un truco inteligente como lo hizo Guffa)

    – hugomg

    8 de abril de 2012 a las 0:25

  • Similar a stackoverflow.com/questions/4548034/…

    –Paul Verest

    6 de marzo de 2014 a las 7:45

  • ¿Responde esto a tu pregunta? ¿Cómo agrego un retraso en un bucle de JavaScript?

    – Ivar

    13 abr 2021 a las 9:30

Avatar de usuario de Guffa
Guffa

No puede usar un retraso en la función, porque entonces el cambio que le hace al elemento no se mostrará hasta que salga de la función.

Utilizar el setTimeout para ejecutar piezas de código en un momento posterior:

var s = document.getElementById("div1");
for (i = 0; i < 10; i++) {

  // create a closure to preserve the value of "i"
  (function(i){

    window.setTimeout(function(){
      s.innerHTML = s.innerHTML + i.toString();
    }, i * 2000);

  }(i));

}

  • @Pointy: Buen punto. Agregué un cierre para preservar cada valor.

    – Guffa

    7 abr 2012 a las 22:11

  • @Guffa: Sus corchetes están apagados en la ejecución de su función

    – Vidrio roto

    7 abr 2012 a las 23:55

  • @BrokenGlass: No, no lo son. El código funciona bien. jsfiddle.net/Guffa/PcuxY

    – Guffa

    8 de abril de 2012 a las 8:27

  • Estoy un poco confundido, si el cierre “conserva el valor de i“¿Por qué no es lo que se calcula por i * 2000 igual a 0 como 0 es el primer valor de i? O si i se incrementa en cada iteración, ¿por qué la duración entre cada iteración innerHTML actualización no aumentó de la misma manera?

    – 1252748

    23 de noviembre de 2016 a las 6:03

  • es aún más confuso cuando inicio sesión en la primera línea del ciclo y la primera línea de la vida: ambos registran `0-9` inmediatamente. Sé que ha pasado mucho tiempo, pero ¿puedes explicar un poco qué está pasando aquí? jsbin.com/foqineciva/edit?html,js,salida

    – 1252748

    23 de noviembre de 2016 a las 6:15

avatar de usuario de nicosantangelo
nicosantangelo

var wonderfulFunction = function(i) {
   var s = document.getElementById("div1"); //you could pass this element as a parameter as well
   i = i || 0;
   if(i < 10) {
      s.innerHTML = s.innerHTML + i.toString();

      i++;
      //create a pause of 2 seconds.
      setTimeout(function() { wonderfulFunction(i) }, 2000);          
   }
}

//first call
wonderfulFunction(); //or wonderfulFunction(0);

No puede pausar el código javascript, todo el lenguaje está hecho para funcionar con eventos, la solución que proporcioné le permite ejecutar la función con cierto retraso, pero la ejecución nunca se detiene.

  • Esto tendrá un gran problema porque todas las funciones de tiempo de espera comparten el mismo valor de “i”. Todos pasarán 11 a “funciónmaravillosa”.

    – Puntiagudo

    7 abr 2012 a las 22:10

  • ¿Cuál es el for bucle para? Dado que siempre ejecuta el break ¿No sería más sencillo usar un if ¿declaración? Por la misma razón, no veo por qué necesitas la función interna…

    – nnnnnn

    7 abr 2012 a las 22:34


  • @nnnnnn Porque edité la respuesta sin pensar. Tomé un enfoque diferente al principio y luego lo cambié para usar el cierre. El camino está escrito el for es inútil, tiempo de edición :).

    – nicosantangelo

    7 abr 2012 a las 22:39

  • Lo siento, mi sintaxis JS no es la mejor. que dice la linea i = i || 0; ¿significar?

    – Víctor Resnov

    28 de noviembre de 2019 a las 15:07

  • @VictorResnov significa “asignar i a sí mismo si el valor de i es veraz, de lo contrario asígnalo a 0″ developer.mozilla.org/en-US/docs/Glossary/Truthy

    – nicosantangelo

    5 de marzo de 2020 a las 15:26

Probé todos, pero creo que este código es mejor, es un código muy simple.

var s = document.getElementById("div1");
var i = 0;
setInterval(function () {s.innerHTML = s.innerHTML + i.toString();  i++;}, 2000);

Avatar de usuario de SKing7
SKing7

si desea crear una pausa o un retraso en el bucle FOR, el único método real es

while (true) {
    if( new Date()-startTime >= 2000) {
        break;
    }
}

el tiempo de inicio es el tiempo antes de ejecutar el tiempo, pero este método hará que los navegadores se vuelvan muy lentos

Es imposible pausar directamente una función Javascript dentro de un for bucle y luego reanudar en ese punto.

Avatar de usuario de Starx
estrellax

Así es como debes hacerlo

var i = 0;
setTimeout(function() {
   s.innerHTML = s.innerHTML + i.toString();
   i++;
},2000);

avatar de usuario de zatatatata
zatatatata

El siguiente código es un ejemplo de pseudo-multiproceso que puede hacer en JS, es más o menos un ejemplo de cómo puede retrasar cada iteración de un bucle:

var counter = 0;

// A single iteration of your loop
// log the current value of counter as an example
// then wait before doing the next iteration
function printCounter() {
    console.log(counter);
    counter++;
    if (counter < 10)
        setTimeout(printCounter, 1000);
}

// Start the loop    
printCounter();

¿Ha sido útil esta solución?