Pracuję nad aplikacją, która implementuje Longpolling, ponieważ chcę, aby użytkownik otrzymał powiadomienia, gdy tylko przybyli. Mam tę część działającą, ale muszę też rozszerzyć to funkcją javascript, która wysyła "bicie serca" do serwera co 20 sekund.

Moje pytanie: Jak mogę to zrobić bez całkowicie przerywania kodu przez 20 sekund (tak, że inny JavaScript jest nadal wykonywany podczas liczenia) i czy istnieje jakiś sposób, aby użyć drugiego połączenia? Ponieważ nie chcę, aby moje longpolling zostało przerwane, gdy bicie serca zostanie wysłany do użytkownika.

Jakieś pomysły?

3
user393964 12 grudzień 2011, 13:01

2 odpowiedzi

Najlepsza odpowiedź

Nie musisz prowadzić wielu połączeń za to, co próbujesz osiągnąć. Asynchroniczny charakter JavaScript pozwala na utrzymanie przy życiu, podczas gdy inne rzeczy są przetwarzane. Być może pomyślałeś, że XHR Blokowano XHR JavaScript, ponieważ jest to pojedyncze gwintowane.

XHR w JavaScript jest nie blokujący z powodu modelu pętli zdarzeń - silniki JavaScript są stale w pętli, sprawdzając, czy zarejestrowane połączenia zostały zakończone i czy jego wywołania zwrotne powinny być przetwarzane. Pozwala to na nie blokowanie, a tym samym umożliwia jednocześnie pojedynczą aplikację JavaScript, aby przetworzyć wiele długich żądań odpytywania XHR.

Jeśli jesteś w stanie korzystać z jQuery na żądanie, otaczają xHR całkiem ładnie za pomocą tej funkcji: http: / /api.jquery.com/jquery.ajax/. Dzięki temu możesz zdefiniować limit czasu 20 sekund i obsługiwać go natychmiast (aby ponownie zainicjować połączenie z serwerem).

Na bok - możesz rozważyć twój stos serwerów, aby zoptymalizować długi głosowanie. Upewnij się, że serwer WWW nie pojawia się wątku na żądanie (jak Apache 2.2) - w przeciwnym razie szybko zabraknie zasobów systemowych! Jeśli możesz korzystać z węzła

1
badunk 17 marzec 2012, 05:32

Użyj setInterval(yourHearbeatFunction, 20000), nie blokuje wątku wykonania JavaScript. Tak więc prośba Longpolled zostanie przetworzona jak najszybciej.

4
Just_Mad 12 marzec 2012, 18:36