Jest to sposób na skonfigurowanie setInterval
metody javascript do natychmiastowego wykonania metody, a następnie wykonania z timerem
javascript
setinterval
Jorge
źródło
źródło
function
raz, a następnie wykonaćsetInterval()
Odpowiedzi:
Najłatwiej jest po prostu wywołać tę funkcję bezpośrednio za pierwszym razem:
Istnieją jednak dobre powody, aby tego unikać
setInterval
- w szczególności w niektórych okolicznościach cały szeregsetInterval
zdarzeń może nadejść natychmiast po sobie bez żadnych opóźnień. Innym powodem jest to, że jeśli chcesz zatrzymać pętlę, musisz jawnie wywołać,clearInterval
co oznacza, że musisz pamiętać uchwyt zwrócony z pierwotnegosetInterval
wywołania.Zatem alternatywną metodą jest
foo
wyzwalanie się dla kolejnych wywołań za pomocąsetTimeout
:Gwarantuje to, że między rozmowami jest co najmniej przerwa
delay
. Ułatwia także anulowanie pętli w razie potrzeby - po prostu nie dzwoniszsetTimeout
gdy warunek zakończenia pętli zostanie osiągnięty.Co więcej, możesz zawinąć to wszystko w bezpośrednio wywoływane wyrażenie funkcyjne, które tworzy funkcję, która następnie wywołuje się ponownie jak wyżej i automatycznie uruchamia pętlę:
który definiuje funkcję i rozpoczyna cykl od razu.
źródło
setTimeout
?setInterval
zdarzeń może nadejść natychmiast po sobie bez żadnych opóźnień.setTimeout
metody?Nie jestem pewien, czy rozumiem cię poprawnie, ale możesz łatwo zrobić coś takiego:
Jest na to oczywiście wiele sposobów, ale to najbardziej zwięzły sposób, jaki mogę wymyślić.
źródło
arguments.callee
nie jest dostępny w ścisłym trybie ES5Natknąłem się na to pytanie z powodu tego samego problemu, ale żadna z odpowiedzi nie pomaga, jeśli musisz zachowywać się dokładnie tak samo,
setInterval()
ale z jedynym różnicą, że funkcja nazywa się natychmiast na początku.Oto moje rozwiązanie tego problemu:
Zaletą tego rozwiązania:
setInterval
może być łatwo dostosowany przez podstawienieclearInterval()
późniejPrzykład:
Aby być zuchwałym, jeśli naprawdę potrzebujesz użyć,
setInterval
możesz również zastąpić oryginałsetInterval
. Dlatego podczas dodawania tego kodu przed istniejącym kodem nie jest wymagana zmiana kodu:Nadal obowiązują tutaj wszystkie wymienione wyżej korzyści, ale nie jest wymagana zamiana.
źródło
setTimeout
rozwiązania, ponieważ zwracasetInterval
obiekt. Aby uniknąć wywoływania funkcji, które mogą być później w kodzie i dlatego nie są zdefiniowane w chwili obecnej, zawijam pierwsze wywołanie funkcji wsetTimeout
funkcji takiej jak ta:setTimeout(function(){ func();},0);
Pierwsza funkcja jest następnie wywoływana po bieżącym cyklu przetwarzania, który jest również natychmiastowy , ale jest więcej potwierdzonych błędów.Możesz owinąć
setInterval()
funkcję, która zapewnia takie zachowanie:... użyj tego w następujący sposób:
źródło
Oto opakowanie na całkiem fajny, jeśli go potrzebujesz:
Ustaw trzeci argument setInterval na true, a po raz pierwszy uruchomi się natychmiast po wywołaniu setInterval:
Lub pomiń trzeci argument, a on zachowa swoje pierwotne zachowanie:
Niektóre przeglądarki obsługują dodatkowe argumenty dla setInterval, których to opakowanie nie bierze pod uwagę; Myślę, że są one rzadko używane, ale pamiętaj o tym, jeśli ich potrzebujesz.
źródło
Ktoś musi wprowadzić to, co zewnętrzne,
this
jakby to była funkcja strzałki.Jeśli przeszkadzają ci powyższe śmieci, możesz zamiast tego zrobić zamknięcie.
A może rozważyć korzystanie z
@autobind
dekorator w zależności od kodu.źródło
Zasugeruję wywołanie funkcji w następującej kolejności
Możesz również przekazać
_timer
foo, jeśli chceszclearInterval(_timer)
pod pewnym warunkiemźródło
Oto prosta wersja dla nowicjuszy bez całego zamieszania. Po prostu deklaruje funkcję, wywołuje ją, a następnie rozpoczyna interwał. Otóż to.
źródło
Aby rozwiązać ten problem, uruchamiam funkcję po raz pierwszy po załadowaniu strony.
źródło
Jest wygodny pakiet npm o nazwie firstInterval (pełne ujawnienie, to moje).
Wiele przykładów tutaj nie obejmuje obsługi parametrów, a zmiana domyślnych zachowań
setInterval
w każdym dużym projekcie jest zła. Z dokumentów:Ten wzór
jest identyczny z
Jeśli jesteś starą szkołą w przeglądarce i nie chcesz zależności, możesz łatwo wyciąć i wkleić kod.
źródło
Ok, to jest takie skomplikowane, więc powiem bardziej prościej:
źródło
Możesz ustawić bardzo mały początkowy czas opóźnienia (np. 100) i ustawić go na żądany czas opóźnienia w funkcji:
źródło
Wystąpił problem z natychmiastowym asynchronicznym wywołaniem funkcji, ponieważ standardowy setTimeout / setInterval ma minimalny limit czasu około kilku milisekund, nawet jeśli bezpośrednio ustawisz na 0. Jest to spowodowane pracą przeglądarki.
Przykład kodu z PRAWDZIWYM opóźnieniem zerowym, które działa w Chrome, Safari, Opera
Więcej informacji znajdziesz tutaj
Po pierwszym ręcznym wywołaniu możesz utworzyć interwał za pomocą swojej funkcji.
źródło
w rzeczywistości najszybsze jest do zrobienia
wywoła to moją funkcję, a następnie zrobi to agaian co 45 sekund, co różni się od działania
który tego nie nazwie, ale tylko zaplanuj
źródło
myFunction()
gdy sam się zwraca. Zamiast tego modyfikowanie każdej wywoływanej przezsetInterval
nią funkcji jest lepszym podejściem do zawijania,setInterval
gdy proponowane są inne odpowiedzi.