1

同期チャット クライアントとしても機能する Web フォーラムを作成しました (投稿はすぐに表示されます)。これは、単一のロング ポーリング ajax リクエスト (「コメット」と呼ばれることもあります) を使用する通常の方法で機能します。

ユーザーがこれらの「チャットルーム」のいずれかが読み込まれたタブを閉じると、このユーザーがルームを離れることをサーバーに伝えて、「閲覧中のユーザー」リストから削除されるようにする必要があります。離れた後に届いた投稿は未読としてマークされます。

現在、window.onbeforeunload ハンドラーでサーバーへの同期 ajax (open() の 3 番目のパラメーターは false) 要求を使用してこれを行っています。通常は 2 秒未満で戻るため、ユーザビリティへの影響はほとんどまたはまったくありません。

さて、問題です。このユーザーが、同じドメインでホストされているチャット ルームで既に 5 つ以上のタブを開いているとします。それから彼らは1つを閉じます。ドメイン値ごとのブラウザの最大同時httpリクエストが開始され、「私は去ります」同期ajaxリクエストが他のリクエストの1つが完了するのを待ちますが、それらはコメットであるため完了しない場合があります(「ロングポーリング」など) . これで、彼らが閉じようとしたタブを事実上ロックして開いた状態になりました。

JavaScript がシングルスレッド化されていない場合の明白な解決策は、同期 ajax リクエストの短いタイムアウトになります。

4

0 に答える 0