4

私は ajax long polling を勉強していますが、混乱しています。従来の ajax 呼び出しとロング ポーリングの違い

   var lpOnComplete = function(response) {
   alert(response);
   // do more processing
   lpStart();
  };

    var lpStart = function() {
    $.post('/path/to/script', {}, lpOnComplete, 'json');
    };

    $(document).ready(lpStart);

この例は、サーバーを再帰的に呼び出しているだけです。setInterval での従来の呼び出しとの違いは何ですか。

4

4 に答える 4

10

名前が示すように、ロング ポーリングとは、何かを長時間ポーリングすることを意味します。

$.post('/path/to/script', {}, lpOnComplete, 'json');

これが実際のプロセスの開始です. サーバー上のスクリプトに ajax 呼び出しを行います. この場合/path/to/scriptphp.スクリプトは指定された時間 (たとえば 1 分間) 待機する必要があり、最大 1 分間使用可能なデータがない場合は、データなしで返されます。

サーバーが何かを返すとすぐに、コールバック関数で同じスクリプトに対して再度 ajax 呼び出しを行い、サーバー スクリプトが再びプロセスを続行します。

チャット アプリケーションを考えてみましょう。従来の方法では、サーバーを 2 秒ごとにポーリングしており、メッセージが利用できない場合でもサーバーは返します。最大 1 分間サーバーが新しいメッセージを取得しない場合、最後にサーバーに 30 回アクセスすることになります。一分。

ここで、ロング ポーリングの方法を検討します。新しいメッセージを 1 分間待機するようにサーバー スクリプトを設定します。クライアントから、スクリプトに対して単一の ajax 呼び出しを行い、次の 1 分間メッセージが到着しないと伝え、サーバーは 1 分間応答しません。そして、あなたは過去 1 分間に 1 回だけサーバーにアクセスしました。30 ヒット対 1 ヒットを想像できますか

于 2013-03-31T05:16:20.050 に答える
1

長いポーリングでは、データの準備ができていない限り、サーバーは戻りません。それ以外の場合は、データの準備ができるまでネットワーク接続を開いたままにします。データの準備ができた時点で、クライアントはすでに待機しているため、クライアントに「プッシュ」できます。ウィキペディアには適切な説明があります。http://en.wikipedia.org/wiki/Long_polling#Long_polling . あなたの例では、 lponcomplete は何分間も呼び出されない可能性があります。

一定の settimeout タイプのポーリングを使用すると、最初のリクエストが完了した直後に準備ができているデータは、サーバーがクライアントに接続されていないため、次のポーリングまで配信されないことを意味します。

サーバーの場合、長いポーリングはソケットを長時間開いたままにし、リソースを拘束しますが、短いポーリングを繰り返すとネットワーク トラフィックが増加します。

Html5 には、この分野でも役立つ websocket のような新しい機能があります。そのため、それについても読むことをお勧めします。

于 2013-03-30T22:39:57.413 に答える