¿Hay alguna manera de dormir en JavaScript antes de que realice otra acción?
Ejemplo:
var a = 1+3;
// Sleep 3 seconds before the next action here
var b = a + 4;
javascript
sleep
Jin Yong
fuente
fuente
En caso de que realmente necesites un
sleep()
solo para probar algo. Pero tenga en cuenta que bloqueará el navegador la mayoría de las veces durante la depuración, probablemente es por eso que lo necesita de todos modos. En modo producción comentaré esta función.No lo use
new Date()
en el bucle, a menos que quiera desperdiciar memoria, potencia de procesamiento, batería y posiblemente la vida útil de su dispositivo.fuente
Versión ECMAScript 6, utilizando generadores con rendimiento para "bloqueo de código":
Debido a que la pregunta original se publicó hace siete años, no me molesté en responder con el código exacto, porque es demasiado fácil y ya está respondida. Esto debería ayudar en problemas más complicados, como si necesita al menos dos durmientes, o si planea secuenciar una ejecución asincrónica. Siéntase libre de modificarlo para satisfacer sus necesidades.
función*
() => función de flecha
También puede encadenar eventos a través de Promesas :
O sería mucho más simple y menos elegante
Si solo está esperando que ocurra alguna condición, puede esperar así
fuente
Actualización 2018
Los últimos Safari, Firefox y Node.js ahora también son compatibles con async / await / promises.
Usando async / await / Promises:
(A partir del 1/2017, compatible con Chrome, pero no con Safari, Internet Explorer, Firefox, Node.js)
Actualización 2017
JavaScript ha evolucionado desde que se hizo esta pregunta y ahora tiene funciones de generador, y se está implementando el nuevo async / await / Promise.
A continuación hay dos soluciones, una con función de generador que funcionará en todos los navegadores modernos, y otra, utilizando el nuevo async / wait que aún no es compatible en todas partes.Usando una función de generador:
Preste atención al hecho de que ambas soluciones son de naturaleza asíncrona. Esto significa que myAsyncFunc (en ambos casos) volverá mientras duerme.
Es importante tener en cuenta que esta pregunta es diferente a ¿Cuál es la versión JavaScript de sleep ()? donde el solicitante solicita un sueño real (ninguna otra ejecución de código en el proceso) en lugar de un retraso entre las acciones.
fuente
let co = gen => (...args) => { let iter = gen(...args); let resume = () => new Promise((resolve, reject) => { let result = iter.next(); if (result.done) resolve(result.value); else Promise.resolve(result.value).then(resume).then(resolve, reject); }); return resume(); };
le permitiría hacerlolet asyncAdd = co(function* (a, b) { console.log('Sleeping'); yield sleep(3000); console.log('Done'); return a + b; }); asyncAdd(3, 4).then(console.log);
utilizando la definición desleep()
su segundo bloque de código.Si desea funciones menos torpes que
setTimeout
ysetInterval
, puede envolverlas en funciones que simplemente invierten el orden de los argumentos y les dan nombres agradables:Versiones de CoffeeScript:
Luego puede usarlos bien con funciones anónimas:
Ahora se lee fácilmente como "después de N milisegundos, ..." (o "cada N milisegundos, ...")
fuente
Otra forma de hacerlo es mediante Promise y setTimeout (tenga en cuenta que debe estar dentro de una función y configurarla como asíncrona con la palabra clave asíncrona):
fuente
Aquí hay una manera muy simple de hacerlo que 'se siente' como una pausa / suspensión síncrona, pero es un código asíncrono legítimo.
fuente
Puede usar JavaScript simple, esto llamará a su función / método después de 5 segundos:
fuente
Hay varias formas de resolver este problema. Si usamos la
setTimeout
función, vamos a conocerla primero. Esta función tiene tres parámetros:function
ocode
,delay
(en milisegundos) y elparameters
. Como se requiere la función o el parámetro de código , los otros son opcionales. Una vez que no haya ingresado el retraso , se establecerá en cero.Para más detalles sobre el
setTimeout()
ir a este enlace .Versión simplificada:
Usando el paso de parámetro:
Soporte de navegador:
fuente
Este es mi modelo que muestra cómo "dormir" o "DoEvents" en JavaScript utilizando una función de generador (ES6). Código comentado:
fuente
Prueba esta función:
Así es como lo usas:
O ve a prometer estilo:
Aquí hay una demostración .
fuente