Załóżmy, że mam setInterval(PostToServer, 1000);
. PostToServer
Funkcja powoduje, że ajax wysyła, co może potrwać dłużej niż sekundę. Co się więc stanie: drugie połączenie zostanie wykonane, gdy pierwsze nie zostanie zakończone lub oczekiwane jest zakończenie połączenia przed zrobieniem nowego?javascript setInterval: czy wywołania się nakładają?
Odpowiedz
Połączenia nakładają się.
setInterval
zapewnia, że funkcje są uruchamiane regularnie, bez oczekiwania na poprzedni wynik.
Jeśli chcesz poczekać na odpowiedź, zmień metodę interwału na poller. Gdy minie czas ORAZ serwer już odpowiedział, proszę ponownie.
Ponieważ odpowiedź serwera nie zmieni się zbyt szybko zaraz po odpowiedzi, można również dodać procedurę obsługi setTimeout
w funkcji wywołania zwrotnego metody AJAX.
Javascript jest jednym wątkiem (z wyjątkiem pracowników HTML5, którzy nie są zaangażowani w ten problem) z kolejką zdarzeń. Kolejne połączenie od setInterval()
nigdy nie rozpocznie się, dopóki nie zostanie wykonane poprzednie połączenie. Tylko jeden może być aktywny jednocześnie.
Po upływie czasu interwału wewnętrznego w silniku JS timer uruchamia się i zdarzenie jest dodawane do kolejki zdarzeń javascript. Gdy aktualnie uruchomiony wątek wykonywania JS zostanie zakończony (a nie wcześniej), silnik JS przejdzie i pobierze następne zdarzenie z kolejki zdarzeń i uruchomi ten wątek wykonania JS. W ten sposób dwie ścieżki wykonywania w JS nigdy nie będą się nakładać ani działać jednocześnie. Tak więc dwa wywołania funkcji z setInterval() nigdy się nie pokrywają. Drugi nie rozpocznie się, dopóki nie wykona pierwszego.
Ale w odniesieniu do twojego pytania, oznacza to, że dwa interwały z setInterval()
nigdy się nie pokrywają, ale jeśli wykonujesz asynchroniczne wywołanie ajax na pierwszym interwale i natychmiast rozpocznie się wywołanie ajax, a drugi interwał wystrzeliwuje, zanim pierwsze asynchroniczne wywołanie ajaxa wystrzeliło jego funkcję zakończenia, wtedy twoje wywołania ajaxowe będą lub mogą się nakładać.
Jeśli nie chcesz, aby więcej niż jedno wywołanie ajax było w locie na raz, musisz napisać jakiś kod, aby zapobiec temu, nie wywołując drugiego wywołania ajax, dopóki poprzednie nie zostanie zakończone lub po prostu pomijając każde wywołanie ajax, jeśli poprzedni nadal trwa.
Aby uzyskać więcej informacji o kolejce zdarzeń JS i sposobie działania, zobacz artykuł this post.
Tak, nakłada się. Możesz użyć setTimeout
w funkcji PostToServer, aby się upewnić, że się nie nakłada, ale problem polega na uruchomieniu żądania, a następnie odczekaniu 1s, a następnie ponownym uruchomieniu żądania. Więc nie działa co sekundę dokładnie.
Aby uzyskać więcej informacji, zobacz ten film Paula Irlandczyków: http://youtu.be/i_qE1iAmjFg?t=7m46s
- 1. Ograniczenia JavaScript setInterval?
- 2. wywołania funkcji anonimowy zdefiniowane w setInterval
- 3. metoda wychodzenia setInterval w javascript
- 4. JavaScript setInterval funkcji z argumentami
- 5. Witryna z uruchomionym JavaScript setInterval rozpoczyna się niepowodzeniem po ~ 1day
- 6. Jak nakładają się w formularzach Xamarin?
- 7. Dlaczego nakładają się moje elementy div?
- 8. Funkcja wywołania JavaScript po window.open
- 9. node.js: setInterval() pomijanie połączeń
- 10. Javascript - Zresetuj setInterval z powrotem do 0
- 11. Przechwytywanie pozycji myszy na setInterval() w JavaScript
- 12. Python Równoważnik setInterval()?
- 13. matplotlib xticks etykiety nakładają
- 14. Dopasowanie do wzorca nakładają się - Dopasowanie wzorca do operatorów
- 15. Zatrzymaj setInterval
- 16. Odwoływanie się do "tego" z poziomu wywołania zwrotnego javascript
- 17. Potrzebujesz podłączyć się do wywołania funkcji javascript, w jaki sposób?
- 18. Animowany obraz nie porusza się podczas długiego wywołania metody javascript
- 19. Czy blokuje się metoda JavaScript WebSocket.send?
- 20. Czy elementy nakładają się na e-maile HTML z obsługą wielu klientów?
- 21. Czy można wywołać metodę clearInterval() przed setInterval()?
- 22. Ile efektu może mieć CPU na JavaScript setInterval
- 23. Wywołanie metody obiektowej Javascript za pomocą funkcji SetInterval()
- 24. dlaczego cykl setInterval() staje się szybszy za każdym razem?
- 25. Czy wywołania metody Javascript są wątkowane lub synchronizowane?
- 26. Czy nakładki WF i nServiceBus nakładają się? W jaki sposób? I do którego użyć?
- 27. Obejście problemu wycieku pamięci setInterval
- 28. jquery setInterval lub przewinąć
- 29. Czy można wywołać metodę clearInterval wewnątrz procedury obsługi setInterval?
- 30. setInterval zatrzymuje się w iphone/ipad (mobilny Safari) podczas przewijania
@ jfriend00 Ta odpowiedź jest poprawna. OP pyta, czy funkcja w 'setInterval' czeka na zakończenie żądania AJAX z poprzedniej metody' setInterval', ** nie ** dla końca funkcji w poprzednim wywołaniu 'setInterval'. –
Początkowo błędnie przeczytałem pytanie i wycofałem swój komentarz i stwierdzenie. Początkowo myślałem, że pytają, czy dwie wywołania zwrotne setInterval mogą się nakładać (ale nie mogą). Nie widziałem, żeby rozmawiali o wywołaniach ajaxowych uruchamianych z przerwami. – jfriend00