更新
私はこれについて賛成票を受け取り続けているので、この回答は4歳であることを覚えておくことは合理的だと思います。ウェブは非常に速いペースで成長しているので、この答えに注意してください。
最近同じ問題があり、この問題について調査しました。
与えられた解決策はロングポーリングと呼ばれ、それを正しく使用するには、AJAXリクエストに「大きな」タイムアウトがあることを確認し、現在の終了(タイムアウト、エラー、または成功)後に常にこのリクエストを行う必要があります。
ロングポーリング-クライアント
ここでは、コードを短くするために、jQueryを使用します。
function pollTask() {
$.ajax({
url: '/api/Polling',
async: true, // by default, it's async, but...
dataType: 'json', // or the dataType you are working with
timeout: 10000, // IMPORTANT! this is a 10 seconds timeout
cache: false
}).done(function (eventList) {
// Handle your data here
var data;
for (var eventName in eventList) {
data = eventList[eventName];
dispatcher.handle(eventName, data); // handle the `eventName` with `data`
}
}).always(pollTask);
}
次のことを覚えておくことは重要です(jQuery docsから):
jQuery 1.4.x以下では、リクエストがタイムアウトした場合、XMLHttpRequestオブジェクトは無効な状態になります。オブジェクトメンバーにアクセスすると、例外がスローされる場合があります。Firefox 3.0以降のみ、スクリプトおよびJSONPリクエストはタイムアウトによってキャンセルできません。スクリプトは、タイムアウト期間後に到着しても実行されます。
ロングポーリング-サーバー
特定の言語ではありませんが、次のようになります。
function handleRequest () {
while (!anythingHappened() || hasTimedOut()) { sleep(2); }
return events();
}
ここでhasTimedOut
は、コードが永遠に待機しないanythingHappened
ようにし、イベントが発生したかどうかを確認します。これsleep
は、何も起こらない間にスレッドを解放して他のことを行うためのものです。events
JSON形式のイベントの辞書(またはあなたが好むかもしれない他のデータ構造)を返します(または任意の他のあなたが好みます)。
確かに問題は解決しますが、私が研究していたときのようにスケーラビリティとパフォーマンスについて心配している場合は、私が見つけた別の解決策を検討するかもしれません。
解決
ソケットを使用してください!
クライアント側では、互換性の問題を回避するために、socket.ioを使用します。ソケットを直接使用しようとし、ソケットが利用できない場合、他のソリューションへのフォールバックがあります。
サーバー側で、NodeJSを使用してサーバーを作成します(ここの例)。クライアントは、サーバーで作成されたこのチャネル(オブザーバー)にサブスクライブします。通知を送信する必要がある場合は常に、このチャネルで通知が発行され、添え字(クライアント)に通知されます。
このソリューションが気に入らない場合は、APE(Ajax Push Engine)を試してください。
私が助けてくれたことを願っています。