2011-12-29 7 views
17

Chcę utworzyć zegar, który po osiągnięciu określonego punktu resetuje zegar, a następnie rozpoczyna się od nowa.pętla timera javascript

W tej chwili mam ustawioną pętlę, a jako test chcę ją zresetować po 5000 ms (5 sekund). Ale licznik przechodzi wszystkie szaleństwa.

WIP Demo tutaj: http://jsfiddle.net/stursby/wUHA3/

+1

Przed klikam demo, będzie rozbić moją przeglądarkę? ': P' –

+0

Licznik zresetował w Firefox ... –

+0

haha ​​nie, to nie jest nieskończona pętla. Aktualizuję tekst przęsła z aktualną wartością timera ... więc to jedyna rzecz, która się popsuje, zobaczysz. – stursby

Odpowiedz

43

Zamiast setTimeout, należy rozważyć użycie setInterval. Powtarza się automatycznie, dopóki nie usuniesz przerwy.

setInterval(myMethod, 5000); 

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

Zgadzam się, aby wskazać powód, dla którego problem jest opisany z powodu wiersza 'var diff = (new Date(). getTime() - start) - czas; 'nie ma potrzeby dla tej linii. Powinien robić 'window.setTimeout (instancja, 100);' zamiast 'window.setTimeout (instancja, (100 - diff));'. A jego problem został rozwiązany. – Chad

+0

Możesz to opublikować jako odpowiedź, ponieważ jest tak samo ważna. PO może wówczas zdecydować, czy metoda ta może odpowiadać ich ogólnemu programowi. Chociaż setInterval zwykle ma sens w takim przypadku, twój kod bezpośrednio rozwiązuje problem. – keyboardP

+0

Dobry pomysł, wysłany. – Chad

5

zgadzam się z keyboardP że powinieneś być korzystając setInterval zamiast setTimeout. Jednak, aby odpowiedzieć na pierwotne pytanie, przyczyną problemów z timerem jest logika powtórzeń. Nie stosować:

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

Nie trzeba spróbować i konto na czas wykonania (które zakładam, że jest to, co staraliśmy się zrobić z diff). Wystarczy założyć, że jest nieistotny i zastosowanie:

setTimeout(instance, 100); 

A twój problem zostanie rozwiązany, jak widać w this jsFiddle.

+0

+1 (bez zaskoczenia: D) za naprawienie oryginalnego kodu OP. – keyboardP

+0

Czy istnieje prosty sposób na zwiększenie o 1 zamiast 100? Na przykład 2.1 sekundy to 2100, czy istnieje sposób na uzyskanie większej liczby miejsc po przecinku, takich jak 2,154 sekundy, czy 2154 na zegarze? – stursby

+0

cóż, dokładność nie będzie dokładna do milisekundy. Przeglądarki oceniają inaczej limity czasu/interwały. Średnio co 13ms ocenia się limit czasu. SO jest mniej więcej tak szczegółowe, jak tylko możliwe, w zależności od przeglądarki. – Chad