3

ユーザーが到着したらすぐに通知を受け取るようにするため、ロングポーリングを実装するアプリケーションに取り組んでいます。この部分は機能していますが、20秒ごとに「ハートビート」をサーバーに送信するjavascript関数でこれを拡張する必要もあります。

私の質問:コードを20秒間完全に中断せずにこれを行うにはどうすればよいですか(カウント中に他のjavascriptが実行されるように)、これに2番目の接続を使用する方法はありますか? ハートビートがユーザーに送信されたときに longpolling が中断されたくないためです。

何か案は?

4

3 に答える 3

6

以下のスレッドはかなり古いものですが、ブラウザーが XMLHttpRequest を介して一度に複数の接続を許可していることを示しています。

一般的なブラウザで許容される同時 AJAX (XmlHttpRequest) リクエストの数は?

XMLHttpRequest を使用するか、comet を実装するその他の手段を使用して長いポーリング セッションを行っている場合でも、setInterval または setTimeout 関数の一部として、ブラウザによって課される有限の制限に達するまで、同じサーバーに対して別のリクエストを作成できます。 XHRの構築に非同期フラグを含めることを確認する必要があります。

var heartbeatXhr = new XMLHttpRequest();
heartbeatXhr.open('GET', '/polling-url', true); // true for asynchronous
于 2012-03-12T18:38:16.073 に答える
4

を使用するsetInterval(yourHearbeatFunction, 20000)と、Javascript 実行スレッドがロックされません。そのため、ロングポーリングされたリクエストは、来るとすぐに処理されます。

于 2012-03-12T18:36:50.123 に答える
1

達成しようとしていることのために複数の接続を維持する必要はありません。Javascript の非同期性により、他の処理が行われている間も接続を維持できます。シングル スレッドであるため、javascript の XHR がブロックされていると考えたことがあるかもしれません。

JavaScript の XHR は、イベント ループ モデルのため、非ブロッキングです。JavaScript エンジンは常にループ内にあり、登録された呼び出しが完了したかどうか、およびそのコールバックを処理する必要があるかどうかを確認します。これにより、その操作がノンブロッキングになり、単一の JavaScript アプリケーションが複数の XHR ロング ポーリング リクエストを処理できるようになります。

リクエストに jQuery を使用できる場合は、この関数で XHR を適切にラップします: http://api.jquery.com/jQuery.ajax/。これにより、20 秒のタイムアウトを定義し、すぐに処理できます (サーバーとの接続を再開するため)。

余談 - 長いポーリングを最適化するためにサーバー スタックを検討することをお勧めします。Web サーバーが (Apache 2.2 のように) 要求ごとにスレッドを生成しないようにしてください。そうしないと、システム リソースがすぐに不足してしまいます! node.js (多数の同時リクエストの処理に最適) を使用できる場合は、サーバー側およびクライアント側のソリューションとして socket.io ライブラリを調べてください (http://socket.io/#home)。

于 2012-03-17T05:32:53.487 に答える