2012-03-02 14 views
5

jQueryUIのプログレスバーには、実行されたクエリの割合が表示されます。 Oracleには、10秒以上かかる操作を表示できる素敵なシステム・テーブルがあります。私は進捗バーをリフレッシュするために、このクエリに千鳥の$ .ajax呼び出しをしようとしています。jQuery AJAXループでjQueryUIをリフレッシュするProgressBar

問題は、待機時間なしで迅速なリクエストを行うループを取得するか、JavaScript全体の実行を遅らせることです。

jQueryUIダイアログで「実行」ボタンをクリックすると、最初のリクエストが開始されます。

$("#dlgQuery").dialog({ 
    buttons: { 
     Execute: function() { 
      $(this).dialog("close"); 
      StartLoop(); 
     } 
    } 
}); 

私はStartLoop()機能のいずれかを構築したり、再帰GetProgress()機能を作成しようとしています。理想的には、ループを終了したり、関数を再帰的に呼び出すのを止めるための指標として、公共の変数var isDone = falseを使用します。ここ

function StartLoop(){ 
    for (var i = 0; i < 100; i++) { 
     GetProgress(); 
    } 
} 

そして、私のサンプルAJAXリクエストです::だから

function GetProgress() { 
    $.ajax({ 
     url: "query.aspx/GetProgress", 
     success: function (msg) { 
      var data = $.parseJSON(msg.d); 
      $("#pbrQuery").progressbar("value", data.value); 
      //recursive? 
      //GetProgress(); 

      //if (data.value == 100) isDone = true;     
     } 
    }); 
} 

私が見つけたものは、これまでの単純化のため

私はちょうど100回実行される静的なループを作っています

setTimeout(GetProgress(), 3000)StartLoop())はJavaScriptがフリーズしてダイアログが閉じることはありません(クエリが完了するまで待つため)。

This 1、pausecomp(3000)とほぼ同じことです。

私のAJAXリクエストの「成功」機能でこれらのいずれかを呼び出すと、無視されます(おそらく別のコールを非同期で開始しているためです)。

私はちょっとここで立ち往生しています。何か助けていただければ幸いです。

+1

興味深い質問です。 :)私は良い答えを考えることができません。 setIntervalを使ってみましたか?あなたは再帰的な方法を試したときに何が起こったのですか? –

+0

私は急速な要求/応答を受け取ります。 – tedski

答えて

16

代わりのsetTimeout(GetProgress(), 3000)、あなたが望む:

function StartLoop(){ 
    for (var i = 0; i < 100; i++) { 
     setTimeout(GetProgress(), 3000*i); 
    } 
} 

そうでない場合は、すべての100は3秒後にオフに起動します。代わりに、0,3000,6000,9000などが必要です。3000*i;

良い、あなたはsetIntervalclearIntervalを使用することができます。

var myInterval = setInterval(GetProgress(), 3000); 

とコールバックで、実行します。

$.ajax({ 
    url: "query.aspx/GetProgress", 
    success: function (msg) { 
     var data = $.parseJSON(msg.d); 
     $("#pbrQuery").progressbar("value", data.value); 

     if (data.value == 100) { 
      isDone = true; 
      clearInterval(myInterval); 
     }   
    } 
}); 

clearInterval再びGetProgress()を呼び出してからそれを停止します。 setIntervalメソッドを使用すると、必要なポーリングループの数を事前に把握する必要がありません。あなたが完了するまで、それは単に続行されます。

いっそ、あなたがあなたのクエリからの応答を持っていたら、それだけで再びポーリングする利点と、AJAXコールバックからGetProgress()を呼び出すことができます。

function GetProgress() { 
    $.ajax({ 
     url: "query.aspx/GetProgress", 
     success: function (msg) { 
      var data = $.parseJSON(msg.d); 
      $("#pbrQuery").progressbar("value", data.value); 

      if (data.value == 100) { 
       isDone = true; 
      } else { 
       setTimeout(GetProgress(), 2000); 
      } 
     } 
    }); 
} 

それからちょうどに一度GetProgress()を呼び出しますループを開始します。

+0

あなたの2番目のソリューションは私には以前よりも意味がありましたが、何らかの理由で成功関数のsetTimeoutを無視しています – tedski

+0

setIntervalとclearIntervalを使用して2番目のソリューションを使用しました。ここで素敵な説明を読んでください:http://www.elated.com/articles/javascript-timers-with-settimeout-and-setinterval/ ありがとう! – tedski

+0

恐ろしい!あなたがうまく働いてうれしいです。 –

0

私がやりたいことは、完了したらもう一度getProgress関数を呼び出すことだと思います。

あなたは、これは一般に「ポーリング」と呼ばれる方法であるAJAX呼び出し

$.ajax({ 
    //this is where your stuff already is 
    ,complete: getProgress() 

    //we add a timeout so it doesn't run everytime it completes, only when we want to update the progress bar. 
    ,timeout: 10000 //this is 10 seconds 
}); 

に「完全」のparamを追加することでこれを行うだろう。

+0

これは有望ですが、残念ながら私は「タイムアウト」とは、ajaxリクエストを削除するまでの時間を指していると思います。私はまだ急速な要求のループを取得しています。 – tedski

+0

あなたは正しいです。ジェフ・Bの答えはまさに私が私のものを修正するつもりだったので、代わりに私は彼をアップボートしています。 – Ohgodwhy

関連する問題