2011-12-08 6 views
27

Ho uno snippet di codice che voglio durare almeno un secondo. Così faccio:Sta chiamando setTimeout con un ritardo negativo ok?

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

Si noti che sleeptime può essere negativo. Posso fare

setTimeout(callback, sleepTime) 

Oppure devo verificare esplicitamente un valore negativo?

risposta

34

Secondo il riferimento MDN, la specifica richiede che ci sia un timeout minimo.

Se fornisci qualcosa di meno (la specifica HTML5 dice 4 ms), il browser ignorerà il tuo ritardo e utilizzerà il minimo.

Quindi i negativi dovrebbero andare bene, dal momento che sarà inferiore al minimo.


A quanto pare, questo non è sempre il caso (non è che sempre il modo con lo sviluppo web!). Secondo (http://programming.aiham.net/tag/browser-compatibility/):

Fornire setTimeout un tempo negativo non sempre come risultato la funzione callback chiamato. Funziona in altri browser, ma in Internet Explorer (8 o inferiore) è necessario assicurarsi che gli eventuali valori negativi di siano azzerati.

Non ho provato io stesso, ma come Thomasz detto, probabilmente è meglio essere sicuri.

+9

Vite IE8. Nessun timeout per te! –

31

Meglio essere sicuri che dispiaciuti:

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

Ah bello, per qualche motivo ho pensato di dover fare 'if (sleepTime> 0) setTimeout (...) else', che sarebbe stato un po 'più brutto. – ripper234

1
if(sleepTime < 0) 
sleepTime = 0; 

setTimeout(callback, sleepTime) ; 

si può fare anche come.

1

Hmm ... Le soluzioni di cui risolve il problema alla chiamata a setTimeout, quindi ha bisogno di essere scritto ogni volta che si effettua una chiamata. Non è meglio risolverlo direttamente in 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) 
Problemi correlati