Si tengo un tiempo de espera activo que se configuró var t = setTimeout("dosomething()", 5000)
,
¿Hay alguna forma de pausar y reanudar?
¿Hay alguna forma de obtener el tiempo restante del tiempo de espera actual?
¿O tengo que hacerlo en una variable, cuando se establece el tiempo de espera, almacenar la hora actual, luego hacemos una pausa, obtenemos la diferencia entre ahora y entonces?
javascript
timeout
Granizo
fuente
fuente
Respuestas:
Podría envolver
window.setTimeout
así, que creo que es similar a lo que sugirió en la pregunta:fuente
setTimeout()
no funciona en Internet Explorer <= 9.timer.resume(); timer.resume();
, terminará teniendo dos tiempos de espera en paralelo. Es por eso que querráclearTimeout(timerId)
primero o hacer unif (timerId) return;
cortocircuito al comienzo del currículum.var timerId, start, remaining;
fuera del alcance de la Clase y agregarremaining = delay;
nuevamente adentro para capturar el parámetro. ¡Aunque funciona como un encanto!if (blah) { ... }
) o algo así?Algo como esto debería funcionar.
fuente
+new Date()
anew Date().getTime()
porque es más rápido: jsperf.com/date-vs-gettimeNo. Necesitará cancelarlo (
clearTimeout
), medir el tiempo desde que lo inició y reiniciarlo con la nueva hora.fuente
Una versión ligeramente modificada de la respuesta de Tim Downs . Sin embargo, desde que Tim revirtió mi edición, tengo que responder esto yo mismo. Mi solución hace posible usar extra
arguments
como tercer parámetro (3, 4, 5 ...) y borrar el temporizador:Como mencionó Tim, los parámetros adicionales no están disponibles en
IE lt 9
, sin embargo, trabajé un poco para que funcione enoldIE
también.Uso:
new Timer(Function, Number, arg1, arg2, arg3...)
fuente
"Pausa" y "hoja de vida" realmente no tiene mucho sentido en el contexto de
setTimeout
, que es una sola vez cosa. ¿Te refieressetInterval
? Si es así, no, no puede pausarlo, solo puede cancelarlo (clearInterval
) y luego reprogramarlo nuevamente. Detalles de todos estos en la sección Temporizadores de la especificación.fuente
El tiempo de espera fue bastante fácil de encontrar una solución, pero el intervalo fue un poco más complicado.
Se me ocurrieron las siguientes dos clases para resolver estos problemas:
Estos se pueden implementar como tales:
Este ejemplo establecerá un tiempo de espera pausable (pt_hey) que está programado para alertar, "hey" después de dos segundos. Otro tiempo de espera hace una pausa pt_hey después de un segundo. Un tercer tiempo de espera se reanuda pt_hey después de dos segundos. pt_hey se ejecuta durante un segundo, se detiene durante un segundo y luego se reanuda. pt_hey se activa después de tres segundos.
Ahora para los intervalos más complicados
Este ejemplo establece un intervalo pausable (pi_hey) para escribir "hola mundo" en la consola cada dos segundos. Un tiempo de espera detiene pi_hey después de cinco segundos. Otro tiempo de espera se reanuda pi_hey después de seis segundos. Entonces pi_hey se activará dos veces, se ejecutará durante un segundo, se detendrá durante un segundo, se ejecutará durante un segundo y luego continuará activando cada 2 segundos.
OTRAS FUNCIONES
clearTimeout () y clearInterval ()
pt_hey.clearTimeout();
ypi_hey.clearInterval();
servir como una forma fácil de borrar los tiempos de espera y los intervalos.getTimeLeft ()
pt_hey.getTimeLeft();
ypi_hey.getTimeLeft();
devolverá cuántos milisegundos están programados para que ocurra el siguiente disparador.fuente
setInterval
? Creo que un simpleif(!true) return;
servirá, ¿o me equivoco?Necesitaba calcular el tiempo transcurrido y restante para mostrar una barra de progreso. No fue fácil utilizar la respuesta aceptada. 'setInterval' es mejor que 'setTimeout' para esta tarea. Entonces, creé esta clase Timer que puedes usar en cualquier proyecto.
https://jsfiddle.net/ashraffayad/t0mmv853/
fuente
/reanimar
Versión ES6 usando azúcar sintáctico Class-y 💋
(ligeramente modificado: inicio agregado ())
fuente
Podrías mirar en clearTimeout ()
o pausa dependiendo de una variable global que se establece cuando se alcanza una determinada condición. Como si se presiona un botón.
fuente
También podría implementarlo con eventos.
En lugar de calcular la diferencia horaria, comienza y deja de escuchar un evento de 'tick' que sigue ejecutándose en segundo plano:
fuente
Si está usando jquery de todos modos, consulte el $ .doTimeout complemento . Esto es una gran mejora con respecto a setTimeout, lo que incluye permitirle realizar un seguimiento de sus tiempos de espera con una única identificación de cadena que especifique y que no cambia cada vez que la configura, e implementar una cancelación fácil, bucles de sondeo y eliminación de rebotes, y más. Uno de mis complementos de jquery más utilizados.
Desafortunadamente, no admite pausa / reanudación de fábrica. Para esto, necesitaría ajustar o extender $ .doTimeout, presumiblemente de manera similar a la respuesta aceptada.
fuente
Necesitaba poder pausar setTimeout () para una función similar a una presentación de diapositivas.
Aquí está mi propia implementación de un temporizador pausable. Integra los comentarios vistos en la respuesta de Tim Down, como una mejor pausa (comentario del kernel) y una forma de creación de prototipos (comentario de Umur Gedik).
Ejemplo:
Para probar el código, use
timer.resume()
ytimer.pause()
varias veces y verifique cuánto tiempo queda. (Asegúrese de que su consola esté abierta).Usar este objeto en lugar de setTimeout () es tan fácil como reemplazarlo
timerID = setTimeout( mycallback, 1000)
contimer = new Timer( mycallback, 1000 )
. Entoncestimer.pause()
ytimer.resume()
están disponibles para ti.fuente
Demostración de trabajo "async" en: sitio zarsoft.info
fuente
Implementación de mecanografiado basada en la respuesta mejor calificada
fuente
Puede hacer lo siguiente para hacer que setTimeout sea pausable en el lado del servidor (Node.js)
y puedes comprobarlo de la siguiente manera
fuente
No creo que encuentres nada mejor que clearTimeout . De todos modos, siempre puede programar otro tiempo de espera más tarde, en lugar de 'reanudarlo'.
fuente
Si tiene varios divs para ocultar, puede usar una
setInterval
y una cantidad de ciclos para hacer como en:fuente