Me gustaría agregar un retraso / suspensión dentro de un while
bucle:
Lo intenté así:
alert('hi');
for(var start = 1; start < 10; start++) {
setTimeout(function () {
alert('hello');
}, 3000);
}
Solo el primer escenario es verdadero: después de mostrar alert('hi')
, esperará 3 segundos y luego alert('hello')
se mostrará, pero luego alert('hello')
se repetirá constantemente.
Lo que me gustaría es que después alert('hello')
se muestre 3 segundos después, alert('hi')
luego debe esperar 3 segundos por segunda vez, alert('hello')
y así sucesivamente.
fuente
for in
bucle?Object.keys()
setTimeout
consetInterval
. Los tiempos de espera se destruyen implícitamente cuando se llama a la devolución de llamada.Intenta algo como esto:
fuente
Si usa ES6, puede usar
let
para lograr esto:Lo que
let
hace es declarari
para cada iteración , no el ciclo. De esta manera, lo que se pasasetTimeout
es exactamente lo que queremos.fuente
i*3000
argumento, dentro del bucle, y lo pasasetTimeout
por valor. El uso delet
es opcional y no está relacionado con la pregunta y la respuesta.i < 10
) para que tenga varios temporizadores trabajando en paralelo, lo que crea una asignación de memoria y es peor en una mayor cantidad de iteraciones.Dado que ES7 hay una mejor manera de esperar un bucle:
Cuando el motor llega a la
await
parte, establece un tiempo de espera y detiene la ejecución delasync function
. Luego, cuando se completa el tiempo de espera, la ejecución continúa en ese punto. Eso es bastante útil ya que puede retrasar (1) bucles anidados, (2) condicionalmente, (3) funciones anidadas:Referencia sobre MDN
Si bien ES7 ahora es compatible con NodeJS y los navegadores modernos, es posible que desee transpilarlo con BabelJS para que se ejecute en todas partes.
fuente
break;
tal vez?Otra forma es multiplicar el tiempo de espera, pero tenga en cuenta que esto no es como dormir . El código después del bucle se ejecutará inmediatamente, solo se aplaza la ejecución de la función de devolución de llamada.
El primer tiempo de espera se establecerá en
3000 * 1
, el segundo3000 * 2
y así sucesivamente.fuente
start
dentro de su función usando este método.Esto funcionará
Pruebe este violín: https://jsfiddle.net/wgdx8zqq/
fuente
$.Deferred
pero fue un escenario diferente para dejarlo funcionar, ¡aprobado!Creo que necesitas algo como esto:
Código de prueba:
Nota: el uso de alertas detiene la ejecución de JavaScript hasta que cierre la alerta. Puede ser más código del que solicitó, pero esta es una solución robusta y reutilizable.
fuente
Probablemente lo usaría
setInteval
. Me gusta esto,fuente
SetInterval()
sigue generando 'hilos' incluso en caso de algún error o bloqueo.En ES6 (ECMAScript 2015) puede iterar con retraso con generador e intervalo.
Ejemplo de código:
Entonces, si está utilizando ES6, esa es la forma más elegante de lograr un bucle con retraso (en mi opinión).
fuente
Puede usar el operador de intervalo RxJS . El intervalo emite un número entero cada x número de segundos, y tomar es especificar el número de veces que tiene que emitir números
fuente
Solo pensé en publicar mis dos centavos aquí también. Esta función ejecuta un ciclo iterativo con un retraso. Ver este jsfiddle . La función es la siguiente:
Por ejemplo:
Sería equivalente a:
fuente
Hago esto con Bluebird's
Promise.delay
y recursividad.fuente
En ES6 puede hacer lo siguiente:
En ES5 puedes hacer lo siguiente:
La razón es
let
que le permite declarar variables que están limitadas al alcance de una declaración de bloque o expresión en la que se utiliza, a diferencia de lavar
palabra clave, que define una variable global o localmente para una función completa, independientemente del alcance del bloque.fuente
Mostrar fragmento de código
Una versión modificada de la respuesta de Daniel Vassallo, con variables extraídas en parámetros para hacer que la función sea más reutilizable:
Primero definamos algunas variables esenciales:
A continuación, debe definir la función que desea ejecutar. Esto se pasará i, el índice actual del bucle y la longitud del bucle, en caso de que lo necesite:
Versión autoejecutable
Versión funcional
fuente
fuente
Hazlo tu:
fuente
fuente
Así es como creé un bucle infinito con un retraso que se rompe en una determinada condición:
La clave aquí es crear una nueva Promesa que se resuelva por tiempo de espera y esperar su resolución.
Obviamente necesita soporte asíncrono / espera para eso. Funciona en el Nodo 8.
fuente
para uso común "olvide los bucles normales" y use esta combinación de "setInterval" que incluye "setTimeOut": así (de mis tareas reales).
PD: Comprenda que el comportamiento real de (setTimeOut): todos comenzarán al mismo tiempo "los tres bla bla bla comenzarán la cuenta atrás en el mismo momento", así que haga un tiempo de espera diferente para organizar la ejecución.
PS 2: el ejemplo para el bucle de tiempo, pero para los bucles de reacción puede usar eventos, promete async esperar.
fuente
fuente
Que yo sepa, el
setTimeout
función se llama asincrónicamente. Lo que puede hacer es envolver todo el ciclo dentro de una función asíncrona y esperar aPromise
que contenga setTimeout como se muestra:Y luego llamas ejecutarlo así:
Tómese un tiempo para comprender la programación asincrónica.
fuente
Solo prueba esto
Resultado
fuente
Aquí hay una función que uso para recorrer una matriz:
Lo usas así:
fuente
Este script funciona para la mayoría de las cosas.
fuente
Prueba esto...
fuente
Implementación simple de mostrar un fragmento de texto cada dos segundos mientras se ejecuta el bucle.
fuente
Prueba esto
fuente