2011-12-29 14 views
17

Quiero crear un temporizador que una vez que llega a cierto punto, el temporizador se restablece, y luego comienza de nuevo.javascript timer loop

Ahora mismo, tengo configurado el lazo, y como prueba quiero que se restablezca después de 5000 ms (5 segundos). Pero el contador se vuelve loco.

WIP demo aquí: http://jsfiddle.net/stursby/wUHA3/

+1

Antes de hacer clic en el demo, va a chocar mi navegador? ': P' –

+0

El contador se restablece en Firefox ... –

+0

jaja no, no es un bucle infinito. Estoy actualizando el texto de un lapso con el valor del temporizador actual ... así que eso es lo único que se estropea, ya lo verás. – stursby

Respuesta

43

En lugar de setTimeout, setInterval considere usar. Se repetirá automáticamente hasta que borre el intervalo.

setInterval(myMethod, 5000); 

function myMethod() 
{ 
    //this will repeat every 5 seconds 
    //you can reset counter here 
} 
+1

Estoy de acuerdo, solo para señalar que la razón por la que está teniendo el problema descrito es debido a la línea 'var diff = (new Date(). getTime() - start) - tiempo; 'no hay necesidad de esa línea. Debería estar haciendo 'window.setTimeout (instancia, 100);' en lugar de 'window.setTimeout (instancia, (100 - diff));'. Y su problema está resuelto. – Chad

+0

Puede publicar eso como respuesta porque es igual de válido. OP puede entonces decidir si ese método puede adaptarse a su programa general. Mientras que setInterval suele tener sentido en un caso como este, su código soluciona directamente el problema. – keyboardP

+0

Buena idea, publicada. – Chad

5

Estoy de acuerdo con keyboardP que probablemente debería estar utilizando en lugar de setIntervalsetTimeout. Sin embargo, para responder a su pregunta original, la razón por la que tiene problemas con el temporizador es debido a su lógica de repetición. No utilice:

var diff = (new Date().getTime() - start) - time; 
window.setTimeout(instance, (100 - diff)); 

No es necesario probar y dar cuenta de tiempo de ejecución (que supongo que es lo que estaba tratando de hacer con diff). Sólo asuma que es insignificante y uso:

setTimeout(instance, 100); 

Y el problema se ha resuelto, como se puede ver en this jsFiddle.

+0

+1 (no es sorpresa: D) para arreglar el código original de OP. – keyboardP

+0

¿hay alguna manera fácil de aumentar en 1 en lugar de 100? Por ejemplo, 2.1 segundos es 2100, ¿hay alguna forma de llegar a más decimales como 2.154 segundos o 2154 en el temporizador? – stursby

+0

y la precisión no será exacta al milisegundo. Los navegadores evalúan los tiempos de espera/intervalos de forma diferente. Como promedio cada 13 ms se evalúa un tiempo de espera. SO, que es lo más específico que puede obtener, dependiendo del navegador. – Chad