2009-07-20 11 views
6

Mam aplikację AJAX, która aktualizuje stronę na podstawie odpowiedzi serwera. Polecenie, na którym opiera się odpowiedź serwera AJAX, generuje pełną odpowiedź, ale wysyła częściowe informacje natychmiast po ich obliczeniu. Ta częściowa odpowiedź/częściowa informacja jest wysyłana w "serii", a czas i rozmiar każdej serii jest nieprzewidywalny. Skrypt CGI (w języku Perl), który przesyła dane wyjściowe do przeglądarki internetowej (do żądania AJAX) ma włączoną autoflush.Radzenie sobie z rosnącą odpowiedzią serwera w AJAX (w JavaScript)

Odpowiedź serwera jest oparta na danych wyjściowych polecenia zewnętrznego. Podczas gdy "time cmd>/dev/null" daje średnio 10.0 sekund, "time cmd | head>/dev/null" daje mniej niż 0,1 sekundy (na przykład dane) Wszystkie dane są wynikiem pojedynczego wywołania tego zewnętrznego polecenia .

sytuacja wygląda następującym (schemat ASCII-art następująco):

client |  | server 
---------  --------- 

request -\ 
      \ 
      \ 
      \ 
      \-> 

      /- response 
      / . 
     /  . 
     //- . 
     <-// . 
     /  . 
     //- [end] 
     <-//
     /
     /
     <-/ 

mam kilka pytań dotyczących tego problemu

. Uwaga: stronie serwera odbywa się za Skrypt CGI w Perlu, a ja wolałbym widzieć (także) rozwiązanie bez Ciebie śpiewaj bibliotekę JavaScript/framework jak jQuery.

  • Dane wyjściowe polecenia używanego po stronie serwera aplikacji AJAX są oparte na linii. Każda grupa linii, zaczynająca się od jednego zdefiniowanego rodzaju linii, a kończąca na innym rodzaju linii, składa się z niezależnych i niezmiennych danych. Czy powinienem po prostu przesłać odpowiedź z polecenia jako "tekst/zwykły" i przetwarzać w JavaScript po stronie klienta, czy też powinienem wstępnie przetworzyć dane na serwerze i wysłać całe porcje danych jako JSON przy użyciu typu MIME "application/json"?

  • Może się zdarzyć, że duży fragment danych wysyłanych natychmiast przez serwer wkrótce pojawi się w innym kawałku danych. Jak radzić sobie z sytuacją, gdy wywoływacz onreadystatechange jest wywoływany, podczas gdy poprzednie wywołanie nie zostało zakończone? Czy należy używać zmiennej globalnej jako semafora, czy też przekazać zmienną stanu jako parametr obsługi (dobrze, użyj xhr.onreadystatechange = function() { handleRequest(xhr, state) })?

  • Czy należy użyć "text/plain" lub "application/json", a może "multipart/x0mixed-replace" dla tego? Uwaga: ta aplikacja powinna działać w (alomst) dowolnej przeglądarce.

  • Jak radzić sobie z przeglądarką internetową (silniki JavaScript), która wywołuje ONReadyStateChange tylko po otrzymaniu pełnej odpowiedzi (więc nie widzę xhr.readyState == 3, tj. Częściową odpowiedź więcej niż raz)? Cóż, oprócz używania niektórych frameworków JavaScript.

  • Jak radzić sobie z niepełnymi odpowiedziami (co w tej sytuacji oznacza niepełne linie).

  • Czy powinienem wysłać koniec znacznika odpowiedzi, czy polegać na liczniku, aby sprawdzić, czy otrzymaliśmy wszystkie dane, czy mogę po prostu polegać na wykryciu xhr.readyState == 4?

Pomocna byłaby nawet częściowa odpowiedź.

Odpowiedz

0

Myślę, że strona klienta mogłaby być zaprojektowana do przetwarzania danych w porcjach, wysyłając powtarzające się żądania AJAX, dopóki wszystkie dane nie zostaną dostarczone. Zakłada się, że każdy fragment może być wysłany w odpowiednim czasie (bez problemów z przekroczeniem limitu czasu po stronie klienta), nawet jeśli cała odpowiedź była duża; i ten projekt jest prawdopodobnie prostszy niż tworzenie sprawdzeń dla określonych stanów częściowej odpowiedzi, które mogą się różnić w zależności od przeglądarki.

Jeśli chodzi o przetwarzanie po stronie serwera lub po stronie klienta, zależałoby to od np. ilu współbieżnych klientów trzeba obsługiwać i czy można użyć buforowania dla żadnej z odpowiedzi; w niektórych scenariuszach, w których jest wielu klientów, lepiej jest obciążyć je pewnym obciążeniem (o ile oczywiście mogą sobie z tym poradzić).

+1

Problem z powtarzającymi się żądaniami AJAX (długa strategia odpytywania) polega na tym, że dane są generowane przez polecenie _single_, więc część serwerowa AJAX musiałaby zapisać stan/zapamiętać stan klient/hasło, aby wysłać dalsze żądania. –

1

Myślę, że Comet jest częścią tego, co jest potrzebne do rozwiązania. Możesz dodatkowo (jeśli mam to prawo) kasy Bayeux Protocol, która została zaimplementowana przez Dojo Foundation. Całość jest wciąż bardzo nowa (choć niektóre z nich mogą być możliwe przy pierwszych implementacjach HTML5).

Poza tym prawdopodobnie musiałbyś zastosować metodę odpytywania. Drugie pytanie dotyczy tego, ile danych może obsłużyć interpreter JavaScript po stronie klienta. Czy jest jakaś możliwość "wglądu" do swoich danych, aby nie mieć problemu z przetwarzaniem żądań w dalszym ciągu przetwarzania, podczas gdy inna reakcja już nadchodzi?

Powiązane problemy