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żyjxhr.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ź.
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. –