2012-02-09 21 views
11

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

7

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.

+0

@ 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'. –

+1

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

8

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.

1

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

Powiązane problemy