Czy jest jakaś różnica?
Tak. Limit czasu jest wykonywany przez określony czas po wywołaniu setTimeout (); Interwał wykonuje określony czas po wystrzeleniu poprzedniego interwału.
Zauważysz różnicę, jeśli wykonanie funkcji doStuff () zajmie trochę czasu. Na przykład, jeśli reprezentujemy wywołanie setTimeout / setInterval za pomocą .
, uruchomienie limitu czasu / interwału *
i wykonanie kodu JavaScript za pomocą [-----]
, linie czasu wyglądają następująco:
Timeout:
. * . * . * . * .
[--] [--] [--] [--]
Interval:
. * * * * * *
[--] [--] [--] [--] [--] [--]
Następną komplikacją jest sytuacja, gdy interwał jest uruchamiany, gdy JavaScript jest już zajęty robieniem czegoś (np. Obsługą poprzedniego interwału). W takim przypadku interwał zostanie zapamiętany i nastąpi natychmiast po zakończeniu poprzedniej procedury obsługi i zwróceniu kontroli do przeglądarki. Na przykład dla procesu doStuff (), który jest czasami krótki ([-]), a czasem długi ([-----]):
. * * • * • * *
[-] [-----][-][-----][-][-] [-]
• reprezentuje odpalanie interwału, które nie mogło od razu wykonać swojego kodu, a zamiast tego zostało oczekujące.
Interwały próbują więc „nadrobić zaległości”, aby wrócić do harmonogramu. Ale nie ustawiają się w kolejce jeden po drugim: na interwał może być tylko jedno wykonanie. (Gdyby wszystkie stały w kolejce, przeglądarka miałaby ciągle powiększającą się listę zaległych wykonań!)
. * • • x • • x
[------][------][------][------]
x oznacza odpalenie interwału, które nie mogło zostać wykonane lub być w toku, dlatego zostało odrzucone.
Jeśli funkcja doStuff () zwykle trwa dłużej niż ustawiony dla niej interwał, przeglądarka zje 100% procesora próbującego ją obsłużyć i może stać się mniej wrażliwa.
Z którego korzystasz i dlaczego?
Chained-Timeout zapewnia przeglądarce wolne miejsce w wolnym czasie; Interwał stara się zapewnić, aby działająca funkcja była wykonywana jak najbliżej zaplanowanych godzin, kosztem dostępności interfejsu użytkownika przeglądarki.
Zastanawiałbym się, czy interwał jednorazowych animacji powinien być jak najbardziej płynny, podczas gdy przerwy w łańcuchach są bardziej grzeczne w przypadku trwających animacji, które miałyby miejsce przez cały czas podczas ładowania strony. W przypadku mniej wymagających zastosowań (takich jak trywialne odpalanie aktualizacji co 30 sekund lub coś w tym rodzaju) możesz bezpiecznie użyć jednego z nich.
Pod względem zgodności z przeglądarkami setTimeout poprzedza setInterval, ale wszystkie przeglądarki, które spotkasz dzisiaj, obsługują oba. Ostatnim maruderem od wielu lat była IE Mobile w WinMo <6,5, ale mam nadzieję, że to też jest już za nami.