2012-03-12 13 views
1

クライアント側でjqueryを実装したASP.Net Webアプリケーションがあります。 whileループの中で、クライアント側のjqueryスクリプトは、サーバー側のコードでWebメソッドへの非同期呼び出しを行います。この呼び出しは、jqueryがユーザーを更新するために使用する長時間実行されているサーバー側タスクのステータスを返します。目標は、ステータスが完了するまでjqueryがサーバーを繰り返し呼び出すようにすることです。終了すると、whileループから抜け出し、タスクが完了したことをユーザーに通知します。WebメソッドへのAJAX呼び出しの繰り返しの遅延

私の問題は、以下のコードはwhileループで実行されますが、状況要求でサーバーが圧倒されないように、呼び出しごとに遅延またはスリープさせたいと考えています。私は以下のコードでsetTimeoutを呼び出そうとしましたが、最初のajax呼び出しでしか動作しません。それ以降のサーバコールを効率的に遅延させる方法はありますか?これは私が記述しているような種類の行動を達成する最も効率的な方法ですか?理想的には、各呼び出しの間に2〜5秒の遅延が必要です。

Iている次のコード

クライアントのjQuery:

var alertTimerId; 
$('input[name=btnStatus]').click(function() { 

    var result = false; 
    //Loop while server reports task complete is true 
    while (!result) { 
     alertTimerId = setTimeout(function() { 
     $.ajax({ 
      type: "POST", 
      url: "Default.aspx/GetStatus", 
      data: "{}", 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      async: true, 
      success: function (msg) { 
      if(msg.d != false) 
       result = msg.d; 
      }, 
      error: function (xhr, ajaxOptions, thrownError) { 
      alert('AJAX failure'); 
      } 
     }); 
     }, 2000); 


     if (count > 0) { 
     count--; 
     } 
    } 


    }); 

サーバー側のASP

[System.Web.Services.WebMethod] 
     public static bool GetStatus() 
     { 
      return result; 
     } 

答えて

5

どのように次のようなものでしょうか?考え方は、Ajax呼び出しは関数doAjax()にカプセル化され、結果がfalseの場合はAjax成功ハンドラ内からsetTimeout()を使用してdoAjaxへの別の呼び出しをキューに入れます。それ以外の場合は、真の結果。 (必要に応じて、あまりにもAjaxのエラーハンドラからdoAjax()を呼び出すことができます。)

$('input[name=btnStatus]').click(function() { 

    function doAjax() { 
     $.ajax({ 
      type: "POST", 
      url: "Default.aspx/GetStatus", 
      data: "{}", 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      async: true, 
      success: function (msg) { 
      if (!msg.d) 
       setTimeout(doAjax, 2000); 
      else { 
       // Success! Notify user here 
      } 
      }, 
      error: function (xhr, ajaxOptions, thrownError) { 
      alert('AJAX failure'); 
      } 
     }); 
    } 

    doAjax(); 

}); 

(注:質問への関連性を持っていないように見えたので、私は、countとif文を削除したあなたの本当のコードを使用している場合。それはあまりにもAjaxの成功ハンドラ内でそれを更新)

+0

私は 'のsetTimeout(doAjax、2000)を追加します;'エラーハンドラ関数にも、Ajaxのリクエストのtimesoutの1つがリクエストのチェーンが壊れないように。 – shaun5

+0

@ shaun5 - 私はそれが適切であるかどうかは、OPに任されていると思いますが、私は説明でそれを言及しました。 (おそらく警告が出ているので、エラーケースでタイムアウトしても構いません。ユーザーがそれを処理している間に若干の遅れがあります。アラートを再試行するかどうかの確認メッセージに変更する方が良いでしょうまたは中止します。) – nnnnnn

+0

@nnnnnn - これはすばらしいことですが、再帰呼び出しを使用するとは思われませんでした。私の唯一の関心事は、クライアント側のバッファ、またはjQueryがその関数キューを格納するために使用する他のキャッシング・メディア(jQueryがキュー参照を格納する方法を完全には理解していないという私の謝罪)、特に非常に長い処理タスクサーバー側で?これが問題になるのかどうか不思議です。再度、感謝します。 – kingrichard2005

0

Underscore.Js.throttle()ヘルパー関数を持っています。

throttle_.throttle(機能、待つ)

が繰り返し呼び出されたときに、呼び出された関数の抑制された新しいバージョンを作成して返します。実際には、待機時のミリ秒ごとに最大でも1回だけ元の関数を呼び出します。 があなたに追いつくよりも速く発生するレート制限イベントに役立ちます。

var throttled = _.throttle(updatePosition, 100); 
$(window).scroll(throttled); 
関連する問題