0

私のアプリでは、毎秒ウェブサーバーにメッセージをポーリングし、それらをフロントエンドに表示しています。これを実現するために setInterval を使用します。ただし、ユーザーがそのページにとどまっている限り、データがなくても、クライアントはリクエストでサーバーをポーリングし続けます。サーバーは、変数を設定することにより、メッセージが生成されなくなったときに通知を出します。この変数を使用して clearInterval を使用し、タイマーを停止することを考えましたが、うまくいきませんでした。この状況で他に何が使えますか?私はjqueryとdjangoを使用しています。これが私のコードです:

jquery:
 var リフレッシュ = setInterval(
        関数 ()
            {
                var toLoad = '/myMonitor'+' #content';             
                $('#content').load(toLoad).show();

            }、1000); // 1000 ミリ秒ごとに更新
    });

html:
div id=コンテンツはこちら

更新するたびに、html で補完するために django 変数にアクセスできます。どうすれば clearInterval を設定できますか?

注: スタック オーバーフローでは > < を配置できないため、html は不完全です

ありがとう

2010 年 3 月 16 日更新 私は何か間違ったことをしているに違いありません。しかし、それを理解することはできません。ここに clearTimer を使用したスクリプトがありますが、機能しません。

var タイマー = null;
$(関数(){
        if ("{{status}}" == "False")
        {
           clearInterval(タイマー);
        }
        そうしないと
        {
            タイマー = setInterval(
                関数(){
                    var toLoad = '/myMonitor'+' #content';  
                    $('#content').load(toLoad).show();}
                    ,1000); // 1000 ミリ秒ごとに更新
        }
    });

status は、"views.py" (Django) で設定されたブール値です。本当にありがとう。

4

2 に答える 2

3

何人かの人々があなたの問題に対する特定のリソースですでに回答しているので、少し背景を説明したいと思います.

つまり、クライアント側での広範なポーリングを回避するために、サーバーがブラウザにデータをプッシュするようにする必要があります。サーバー プッシュをサポートするための適切なクロス ブラウザーの方法はありません。そのため、ポーリングをあまり必要としない一般的な解決策は、Comet (AJAX などの別のクリーニング製品) ロング ポーリング手法を使用することです。

Comet では、ブラウザーが要求を行い、サーバーは新しいデータが利用可能になるまで、応答せずに接続を開いたままにします。サーバーに新しいデータがある場合、サーバー開いている接続を介してそれを送信し、ブラウザーはすぐにそれを受信します。接続がタイムアウトした場合、ブラウザは新しいものを開きます。これにより、サーバーはデータが利用可能になるとすぐにクライアントに送信できます。他の人が指摘したように、このアプローチには Web サーバーの特別な構成が必要です。一定間隔でデータをチェックし、存在する場合はクライアントに応答するスクリプトがサーバー上に必要です。

このアプローチで留意すべきことは、ほとんどの Web サーバーは、クライアントからの要求を受け取り、できるだけ迅速に応答するように構築されているということです。それらは長期間生き続けることを意図していません。Comet を使用すると、通常よりもはるかに多くの接続が開かれ、予想以上に多くのリソースが消費される可能性があります。

于 2010-03-15T17:22:17.127 に答える
0

clearInterval チェックは、ドキュメントの準備完了イベントが発生したときにのみチェックされます。

指定したコードがブラウザに表示されているものとまったく同じである場合、文字列 "{{status}}" を文字列 "False" と比較しています。それが真実であると評価されるのを待つよりも、塗料が乾くのを見たいと思います。

リクエストが完了するまでに 1 秒以上かかる場合はどうなりますか? : サーバーにリクエストが殺到します。

function update () {
  $('#content').show().load('/myMonitor'+' #content', function (response, status) {
    if (!/* whatever you're trying to check*/) {
      setTimeout(update, 1000);
    };
  });
};

$(document).ready(function () {
  update();
});

は以前の場所よりも近づいていますが、ポーリングをいつ停止するかをどのように決定するかを検討する必要があります。

于 2010-03-16T20:11:56.473 に答える