アップデート
私はこれについて賛成票を受け取り続けているので、この答えは4歳であることを覚えておくのは合理的だと思います。Webは非常に速いペースで成長しているので、この答えに注意してください。
私は最近同じ問題を抱えていて、その主題について調査しました。
与えられた解決策はロングポーリングと呼ばれ、それを正しく使用するには、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)を試してください。
私が助けてくれたことを願っています。