Jeśli mam aktywny limit czasu, który został ustawiony var t = setTimeout("dosomething()", 5000)
,
Czy w ogóle można go wstrzymać i wznowić?
Czy istnieje sposób, aby uzyskać czas pozostały w bieżącym limicie czasu?
czy też muszę w zmiennej, gdy ustawiony jest limit czasu, zapamiętać aktualny czas, a następnie zatrzymujemy się, uzyskujemy różnicę między teraz a potem?
javascript
timeout
Hailwood
źródło
źródło
Odpowiedzi:
Mógłbyś zawinąć w
window.setTimeout
ten sposób, co moim zdaniem jest podobne do tego, co sugerowałeś w pytaniu:źródło
setTimeout()
nie działa w Internet Explorerze <= 9.timer.resume(); timer.resume();
, skończysz z dwoma przekroczeniami czasu równolegle. Dlatego chciałbyśclearTimeout(timerId)
najpierw zrobićif (timerId) return;
zwarcie na samym początku wznowienia.var timerId, start, remaining;
poza zakresem Class i dodać zremaining = delay;
powrotem do środka, aby złapać parametr. Działa jak urok!if (blah) { ... }
) czy coś?Coś takiego powinno załatwić sprawę.
źródło
+new Date()
na,new Date().getTime()
ponieważ jest szybszy: jsperf.com/date-vs-gettimeNie. Będziesz musiał to anulować (
clearTimeout
), zmierzyć czas od rozpoczęcia i ponownie uruchomić z nowym czasem.źródło
Nieco zmodyfikowana wersja Tim Downs odpowiedź . Jednak odkąd Tim wycofał moją zmianę, muszę sam na to odpowiedzieć. Moje rozwiązanie umożliwia użycie dodatkowego parametru
arguments
jako trzeciego (3, 4, 5 ...) i wyczyszczenie timera:Jak wspomniał Tim, dodatkowe parametry nie są dostępne w programie
IE lt 9
, jednak popracowałem trochę, aby to zadziałałooldIE
również w programie.Stosowanie:
new Timer(Function, Number, arg1, arg2, arg3...)
źródło
„Wstrzymaj” i „Wznów” nie mają większego sensu w kontekście
setTimeout
, co jest rzeczą jednorazową . Czy masz na myślisetInterval
? Jeśli tak, nie, nie możesz go wstrzymać, możesz go tylko anulować (clearInterval
), a następnie ponownie zaplanować. Szczegóły tego wszystkiego w sekcji Timery specyfikacji.źródło
Timeout był dość łatwy do znalezienia rozwiązania, ale Interval był nieco trudniejszy.
Wymyśliłem następujące dwie klasy, aby rozwiązać ten problem:
Można je wdrożyć jako takie:
Ten przykład ustawi wstrzymany limit czasu (pt_hey), który jest zaplanowany do ostrzeżenia „hej” po dwóch sekundach. Kolejny limit czasu wstrzymuje pt_hey po jednej sekundzie. Trzeci limit czasu zostaje wznowiony pt_hey po dwóch sekundach. pt_hey działa przez jedną sekundę, zatrzymuje się na jedną sekundę, a następnie wznawia działanie. pt_hey uruchamia się po trzech sekundach.
Teraz czas na trudniejsze interwały
W tym przykładzie ustawia się przerywany interwał (pi_hey), aby co dwie sekundy pisać w konsoli „hello world”. Limit czasu zatrzymuje się pi_hey po pięciu sekundach. Po sześciu sekundach zostanie wznowiony kolejny limit czasu pi_hey. Więc pi_hey uruchomi się dwukrotnie, uruchomi się na jedną sekundę, zatrzyma się na jedną sekundę, uruchomi się na jedną sekundę, a następnie będzie kontynuował wyzwalanie co 2 sekundy.
INNE FUNKCJE
clearTimeout () i clearInterval ()
pt_hey.clearTimeout();
ipi_hey.clearInterval();
służyć jako łatwy sposób na wyczyszczenie limitów czasu i przerw.getTimeLeft ()
pt_hey.getTimeLeft();
ipi_hey.getTimeLeft();
zwróci liczbę milisekund do następnego wyzwalacza.źródło
setInterval
? Myślę, że prostyif(!true) return;
wystarczy, czy się mylę?Musiałem obliczyć czas, który upłynął, i pozostały czas, aby wyświetlić pasek postępu. Nie było łatwo skorzystać z zaakceptowanej odpowiedzi. „setInterval” jest lepsze niż „setTimeout” dla tego zadania. Stworzyłem więc klasę Timer, której możesz użyć w dowolnym projekcie.
https://jsfiddle.net/ashraffayad/t0mmv853/
źródło
/wskrzesić
Wersja ES6 wykorzystująca cukier syntaktyczny klasy y 💋
(nieznacznie zmodyfikowano: dodano początek ())
źródło
Możesz zajrzeć do clearTimeout ()
lub wstrzymać w zależności od zmiennej globalnej, która jest ustawiana po spełnieniu określonego warunku. Jak przycisk jest wciśnięty.
źródło
Możesz to również zaimplementować za pomocą wydarzeń.
Zamiast obliczać różnicę czasu, zaczynasz i zatrzymujesz nasłuchiwanie zdarzenia „tick”, które działa w tle:
źródło
Jeśli mimo wszystko używasz jquery, sprawdź $ .doTimeout wtyczkę . Jest to ogromna poprawa w stosunku do setTimeout, w tym umożliwienie śledzenia limitów czasu za pomocą jednego identyfikatora ciągu, który określisz i który nie zmienia się za każdym razem, gdy go ustawisz, i zaimplementuj łatwe anulowanie, pętle odpytywania i podbicie, oraz więcej. Jedna z moich najczęściej używanych wtyczek jquery.
Niestety nie obsługuje wstrzymywania / wznawiania po wyjęciu z pudełka. W tym celu należałoby zawinąć lub rozszerzyć $ .doTimeout, prawdopodobnie podobnie do zaakceptowanej odpowiedzi.
źródło
Musiałem mieć możliwość wstrzymania setTimeout () dla funkcji podobnej do pokazu slajdów.
Oto moja własna implementacja timera z możliwością wstrzymania. Integruje komentarze widoczne w odpowiedzi Tima Downa, takie jak lepsza pauza (komentarz jądra) i forma prototypowania (komentarz Umura Gedika).
Przykład:
Aby przetestować kod, użyj
timer.resume()
itimer.pause()
kilka razy i sprawdź, ile czasu zostało. (Upewnij się, że konsola jest otwarta).Używanie tego obiektu zamiast setTimeout () jest tak proste, jak zastąpienie
timerID = setTimeout( mycallback, 1000)
gotimer = new Timer( mycallback, 1000 )
. Wtedytimer.pause()
itimer.resume()
są dostępne dla Ciebie.źródło
Działające demo "async" pod adresem: site zarsoft.info
źródło
Implementacja maszynopisu na podstawie najwyżej ocenionej odpowiedzi
źródło
Możesz zrobić jak poniżej, aby wstrzymać setTimeout po stronie serwera (Node.js)
i możesz to sprawdzić jak poniżej
źródło
Nie sądzę, że znajdziesz coś lepszego niż clearTimeout . W każdym razie zawsze możesz zaplanować inny limit czasu później, zamiast go „wznawiać”.
źródło
Jeśli masz kilka elementów div do ukrycia, możesz użyć
setInterval
liczby cykli i kilku cykli, jak w:źródło