1

これは初心者の質問かもしれませんが....最近、私はwindow.setTimeoutを使用して、親関数を再帰的に呼び出し、サーバーにajaxポーリングを行います。

function connectToVM(portal) {
    //making the ajax call here....
   if(response.responseText !== "")
     {
    windowInterval = window.setTimeout(function() {
        connectToVM(portal)
    }
    , 4000);
   }
  }

windowIntervalここに私のグローバル変数です。

if(!checkIfChartExists()) {
  window.clearInterval(windowInterval);
}

ここで変数を使用する代わりに、functionto を単純に渡すことができることを知っていclearTimeoutますが、それによって他のすべての間隔も停止されます :(

私がこれを行っている理由は、応答がある場合にのみ、サーバーがタイムアウトを行うためです。私のシナリオは、タイムアウト間隔ごとに更新されるグラフがあります。私の知る限り、間隔を設定すると、変数に特定の値が設定されます(変数に設定されている場合)。そのため、(タイムアウト関数が呼び出されるたびに) 変数を出力すると、一意の int 値が得られます。

多くのタブがあり、多くのタブで同じグラフを使用できます。これは、以前にトリガーされた同じ間隔を利用するだけです。現在、グラフは 1 つしかありません。しかし、表示するグラフは同じタイプのものをたくさん持っています。ゲージチャートと言います。

現在選択されているタブにチャートが存在しないときはいつでも、タイムアウトをクリアする必要があります。したがって、必要なパラメータをこの関数に渡すことで、サーバーへの呼び出しを行う関数を 1 つだけ作成する予定です。

しかし、ポーリングするために、上記の window.setTimeout を使用しています。これは1つのチャートで機能します。ここで、サーバーをポーリングするための別のパラメーター セットを使用して、もう 1 つのグラフを追加しようとします。以前にトリガーされたタイムアウトの ID とは異なる ID を持つ別の setTimeout 関数を使用する必要があります。

また、最初のチャートがすでに存在する場合、タイムアウトはすでにトリガーされており、それを実行し続ける必要があることも考慮する必要があります。そのため、2 番目のタイムアウトをトリガーする必要があります。しかし、ここにはありませんsecond timeout

実行時にいくつのチャートがあるかを実際に予測できないため、これに代わるアプローチがあるかどうか疑問に思っていました。

Question 1 : Can we flood our browser with many timeout's?

Question 2 : How to get the id of that particular timeout, so that I can clearTimeout(id) on it?

Question 3 : Since we can't assign / make variables on the fly, how to set / make such a data structure which can hold such a pointer to the particular chart's index / id.. so that we can easily get hold of it and clear it.

Question 4 : Is this the only way we can poll the server(via AJAX) if we have to poll continually?

最後に、これはまさにcomplex私がここに投稿した問題であることを認識しています。しかし、フォーラムからのアプローチに関する有用な情報を見つけることができると確信しています。私はJSでこれらすべてを行った経験はあまりありませんが、助けていただければ幸いです!


アップデート

申し訳ありませんが、ここにコードを投稿する必要があります..しかし、Extjs を使用してチャート ポートレットを取得しています。関数の私のコードconnectToVMはこれです:

function connectToVM(portalId, host, port, user, passwd, db) {
      try{
        if(Ext.getCmp(portalId)) 
        {
            var gaugeChartForTitle = Ext.getCmp(portalId);

            if(typeof portalOriginalTitle === 'undefined')
                portalOriginalTitle = gaugeChartForTitle.title;

            var gaugeChartDiv = document.getElementById(portalId);

            Ext.Ajax.request({
                      url: "/connectToVM?" +
                            Ext.urlEncode({
                                host: host,
                                port: port,
                                user: user,
                                passwd: passwd,
                                db: db
                            }),
                      method: 'GET',
                      success: function (response, options) {

                          if(response.responseText !== "")
                          {
                              gaugeChartDiv.style.background = "";

                              gaugeChartForTitle.setTitle(portalOriginalTitle);

                              console.log("Virtual Machine at "+ host +" :  BUSY % : "+response.responseText);

                              virtualMachineStore.loadData(generateVirtualMachineData(response.responseText)); //Setting the data1 value of the store and loading it for display!

                              windowInterval = window.setTimeout(function() {
                                  connectToVM(portalId, host, port, user, passwd, db)
                                }
                              , 4000);
                          } 
                          else 
                          {
                              windowInterval = window.setTimeout(function() {
                                  connectToVM(portalId, host, port, user, passwd, db)
                                }
                              , 10000); //Retry every 10 seconds to check if the connection is established!

                              gaugeChartDiv.style.background = "red";
                              gaugeChartForTitle.setTitle(portalOriginalTitle +" - Connection Failure. Reconnecting!");
                          }
                      },
                      failure: function ( result, request) { 
                     }
              });
         }
             }
             catch(err) {
             }
         }

ここで、これを使用して関数をトリガーします。

function setWindowIntervalForVM(portalId) {
       //console.log("isIntervalActivated inside setWindowIntervalForVM() : "+isIntervalActivated);
       if(!isIntervalActivated) {
           connectToVM(portalId, host, port, user, pwd, db);
       }
    }

   function checkIfWindowIntervalIsActivated(portal) {
       if(!isIntervalActivated) {
            setWindowIntervalForVM(portal.id);
            isIntervalActivated = true;
        } else {
            window.clearInterval(windowInterval);
            windowInterval = null;
            isIntervalActivated = false;
        }
   }

これらのシナリオで呼び出すcheckIfWindowIntervalIsActivated()親関数呼び出しも同様です。

1)Gauge Chartが新しく作成されたときはいつでも.. I この呼び出しをトリガーし、 が でboolean isIntervalActivatedある場合false、サーバー ポーリングをトリガーします。

2)したがって、タブ 1 に既にチャートがある場合 (ユーザーが選択したため)、チャートを持ってtab 2いないものに変更します。したがってisIntervalActivated、ポーリングを停止する true に設定するだけです。This is handled for 1 chart. ここでの質問は、この関数を作成したい場合、同じであるがポーリングする別re-usableのチャートをもう 1 つドロップしたい場合、最初のチャートのトリガーされたタイムアウト値を持つ同じ変数をどのように使用するかです。PS: ajax リクエストごとに値が変わります。だから価値はありません:(typeserver parameterswindowInterval1 single

3)他のタブに同じタイプが存在しないときはいつでも投票を停止しchartます。これは完全に理にかなっています。現在、ユーザーが新しいポートレットにドロップするたびに、またはページの読み込み時にすべてのポートレットをキャッシュして、ユーザーが構成したすべてのポートレットをプルしています。そのような ではcase、すべてのcharts'ajax 呼び出しをトリガーする必要がありconfigured destinationます。関数名にあるように、VM にポーリングしているため、グラフがいくつあるかわかりません。したがって、ユーザーが VM1 を消費すると、VM2 に切り替わります。

したがって、このような類似のチャートに対して同じ関数を作成することは絶対に不可能です。re-useだから、同じタイムアウトができるかどうか、またはこの問題に完全にアプローチできるかどうかを確認したかっただけですdifferent:( :(

少し明確になったと思いますが、そうでない場合は、自分の状況をもっと説明できます。必要に応じて、さらに質問してください :) ありがとうございます。

4

2 に答える 2

1
  1. はい
  2. var x = window.setTimeout(...); window.clearTimeout(x);
  3. アクティブなタブのデータ属性、オブジェクトのプロパティ、またはグローバル変数として保存します。多くの異なる方法。サンプル コードを使用すると、これに簡単に答えることができます。

あなたのコメントに基づいて:

var windowInterval;
function connectToVM(portal) {
    if(windowInterval)window.clearTimeout(windowInterval);
    windowInterval = window.setTimeout(function() { ... }, 4000);
}
于 2013-04-30T22:00:57.630 に答える