2011-12-08 32 views
27

Tengo un fragmento de código que quiero durar al menos un segundo. Entonces lo hago:Está llamando a setTimeout con un retraso negativo ¿está bien?

var currentTimeMillis = new Date().getTime(); 
// do stuff 
var sleepTime = 1000 - (new Date().getTime() - currentTimeMillis); 

Observe que sleepTime puede ser negativo. ¿Puedo hacer

setTimeout(callback, sleepTime) 

O debo comprobar un valor negativo explícitamente?

Respuesta

34

Según la referencia MDN, la especificación requiere que haya un tiempo de espera mínimo.

Si proporciona algo inferior a esto (la especificación HTML5 dice 4ms), el navegador simplemente ignorará su retraso y usará el mínimo.

Así que los negativos deberían estar bien, ya que será menos que el mínimo.


Aparentemente, este no es siempre el caso (¿no es siempre así con el desarrollo web?). De acuerdo con (http://programming.aiham.net/tag/browser-compatibility/):

Proporcionar setTimeout un tiempo negativo no siempre dará lugar a la función de devolución de llamada ser llamado. Esto funciona en otros navegadores, pero en el Internet Explorer (8 o inferior) debe asegurarse de que cualquier negativo cambie a cero.

No he probado esto por mi cuenta, pero como dijo Thomasz, probablemente sea mejor estar seguro.

+9

Tornillo IE8. Sin tiempo de espera para ti –

31

Mejor prevenir que curar:

setTimeout(callback, Math.max(sleepTime, 0)) 
+0

Ah, por alguna razón, pensé que debía hacer 'if (hora_de_sobre_ocupación> 0) setTimeout (...) else', que hubiera sido un poco más feo. – ripper234

1
if(sleepTime < 0) 
sleepTime = 0; 

setTimeout(callback, sleepTime) ; 

que se puede hacer como también.

1

Hmm ... Las soluciones mencionadas resuelve el problema de la llamada a setTimeout, por lo que debe ser escrito cada vez que se realiza una llamada. ¿No es mejor resolverlo directamente en setTimeout?

// Run this once. 
(function(){ 
    var oldSetTimeout = setTimeout 
    setTimeout = function(callback, delay){ 
     return oldSetTimeout(callback, Math.max(delay, 0)) 
    } 
})() 

// Call setTimeout safely with a negative delay. 
setTimeout(function(){ console.log("Hello World") }, -42) 
Cuestiones relacionadas