サーバーレスポンスに基づいてページを更新するAJAXアプリケーションがあります。 AJAXサーバーの応答が基づいているコマンドは、完全な応答を生成するのに時間がかかりますが、計算されるとすぐに部分的な情報を送信します。この部分応答/部分情報は「バースト」で送信され、各バーストの時間およびサイズは予測不可能である。ウェブブラウザ(AJAXリクエスト)にコマンド出力をストリームするCGIスクリプト(Perl版)は、自動フラッシュがオンになっています。AJAXでのインクリメンタルサーバーレスポンス(JavaScript)
サーバの応答は外部コマンドの出力に基づいています。 'time cmd |/dev/null'は平均で約10.0秒ですが、 'time cmd | head>/dev/null'は0.1秒未満です(例えばデータ)。 。
client | | server
--------- ---------
request -\
\
\
\
\->
/- response
/ .
/ .
//- .
<-// .
/ .
//- [end]
<-//
/
/
<-/
私はこの問題に関するいくつかの質問を持って
注:サーバ側として行われる。以下(アスキーアート図は以下の)が同じような状況が見え
PerlのCGIスクリプトです。私は(また)あなたがいなくても解決したいと思うでしょうjQueryのようなJavaScriptライブラリ/フレームワークを歌います。
AJAXアプリケーションのサーバー側で使用されるコマンドの出力は、行ベースです。 1つの定義された種類の行から始まり、他の種類の行で終わる各行のグループは、独立したデータと変更できないデータで構成されます。コマンドのレスポンスを 'text/plain'としてストリーミングしてJavaScriptでクライアント側で処理するか、サーバー上のデータを前処理して、JSONとして 'application/json' mimetypeを使用してデータ全体を送信すべきですか?
サーバによって一度に送信される大きなデータチャンクのすぐ後に、別のデータがすぐに続くことがあります。前の呼び出しが完了していない間に
onreadystatechange
ハンドラが呼び出されたときの対処方法セマフォーとしてグローバル変数を使用するか、ハンドラーパラメーターとして状態変数を渡すべきですか(よく、xhr.onreadystatechange = function() { handleRequest(xhr, state) }
を使用します)?「text/plain」または「application/json」、または「multipart/x0mixed-replace」を使用する必要がありますか?注:このアプリはどのブラウザでも動作します。
完全な応答を受信した後でのみ、onReadyStateChangeを呼び出すWebブラウザ(JavaScriptエンジン)を処理する方法(
xhr.readyState == 3
、つまり部分応答が2回以上表示されない)さて、いくつかのJavaScriptフレームワークの使用の横にあります。不完全な応答(この場合、不完全な行を意味します)を処理する方法。
レスポンスの終了マーカーを送信するか、カウンタを使用してすべてのデータを受信したかどうかを確認するか、単に
xhr.readyState == 4
の検出に頼ることができますか?
部分的な応答も役立ちます。
繰り返しAJAXリクエスト(ロングポーリング戦略)の問題は、_single_コマンドによってデータが生成されるため、AJAXのサーバー部分がクライアント/パスの状態を保存して以降のリクエストを送信する必要があります。 –