2011-12-08 17 views
27

Mam fragment kodu, który chcę trwać co najmniej sekundę. Tak więc:Czy wywołanie setTimeout z ujemnym opóźnieniem jest ok?

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

Zauważ, że funkcja sleepTime może być ujemna. Czy mogę wykonać jednoznaczne stwierdzenie wartości ujemnej? Nie. Czy mogę jednoznacznie sprawdzić wartość ujemną?

Odpowiedz

34

Zgodnie z odniesieniem MDN specyfikacja wymaga, że ​​istnieje minimalny czas oczekiwania.

Jeśli podasz coś mniej niż to (specyfikacja HTML5 mówi 4 ms), przeglądarka po prostu zignoruje opóźnienie i użyje minimalnej.

Więc negatywy powinny być w porządku, ponieważ będzie to mniej niż minimum.


Najwyraźniej nie zawsze tak jest (nie jest tak zawsze w przypadku tworzenia stron WWW!). Według (http://programming.aiham.net/tag/browser-compatibility/):

Zapewnienie setTimeout ujemnym czasie nie zawsze prowadzą do funkcji zwrotnej miano. To działa w innych przeglądarkach, ale w Internet Explorer (8 lub niższej) musisz upewnić się, że wszystkie ujemne czasy zostały zmienione na zero.

Nie testowałem tego sam, ale jak powiedział Thomasz, prawdopodobnie lepiej być bezpiecznym.

+9

Śruba IE8. Brak czasu dla Ciebie! –

31

Lepiej dmuchać na zimne:

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

Ach, fajnie, z jakiegoś powodu myślałem, że muszę zrobić 'if (sleepTime> 0) setTimeout (...) else', co byłoby nieco brzydsze. – ripper234

1
if(sleepTime < 0) 
sleepTime = 0; 

setTimeout(callback, sleepTime) ; 

możesz zrobić podobnie.

1

Hmm ... Rozwiązania wspomniane rozwiązuje problem przy wywołaniu setTimeout, więc to musi być napisane za każdym razem połączenie jest wykonane. Czy nie lepiej rozwiązać go bezpośrednio w setTimeout?