2012-03-12 62 views
1

我有一個ASP.Net Web應用程序與jQuery實現在客戶端。在一個while循環中,客戶端jquery腳本在服務器端代碼中對Web方法進行異步調用。該調用返回jquery用來更新用戶的長時間運行的服務器端任務的狀態。我們的目標是讓jquery在狀態完成之前多次調用服務器,一旦完成它跳出while循環並通知用戶任務已完成。重複AJAX調用Web方法之間的延遲

我的問題是,下面的代碼在while循環中運行,但我想讓它在每次調用之間延遲或休眠,以防止使服務器處於狀態請求狀態。我嘗試在下面的代碼中調用setTimeout,但它只適用於最初的ajax調用,每個後續調用都會背對背。有沒有辦法有效地延遲每次後續的服務器調用?這是實現我所描述的行爲的最有效方式嗎?理想情況下,我希望每次通話之間有2-5秒的延遲時間。

我有以下代碼

客戶的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()中,然後從Ajax成功處理函數中進行封裝,如果結果爲false,則使用setTimeout()將另一個調用排隊到doAjax,否則您將採取任何想要採取的操作真正的結果。 (你可以從阿賈克斯錯誤處理程序可選呼叫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(); 

}); 

(注:我已經刪除了if語句count,因爲它似乎沒有關聯的問題。如果你真正的代碼使用。它只是阿賈克斯成功處理程序內更新太)

+0

我想補充'的setTimeout(doAjax,2000);'到錯誤處理程序函數一樣,所以請求的鏈不破如果Ajax請求timesout之一。 – shaun5 2012-03-12 03:03:17

+0

@ shaun5 - 我想這取決於OP是否合適,但我在我的解釋中提到了它。 (我可能不會在誤差情況下超時,但因爲已經有一個提醒,所以在用戶處理時會稍微延遲一點。最好將alert改爲一個關於是否要重試的確認消息或中止。) – nnnnnn 2012-03-12 03:09:23

+0

@nnnnnn - 這很奇妙,沒想到要使用遞歸調用。我唯一擔心的是,客戶端緩衝區或其他緩存介質jQuery是否會使用它來存儲其函數隊列(對於不完全瞭解jQuery如何存儲隊列引用),被填充甚至溢出,尤其是在處理任務很長的情況下在服務器端?只是好奇這是否會成爲問題。再次感謝。 – kingrichard2005 2012-03-12 05:00:08

0

Underscore.Js具有.throttle()輔助函數:

throttle_.throttle(功能,等)

創建並返回傳遞函數的一個新的限制版本,當重複調用 時,實際上只會在每等待幾毫秒時最多調用一次原始函數一次 。對於速度限制事件很有用,該事件發生的速度比您能夠跟上的要快。

var throttled = _.throttle(updatePosition, 100); 
$(window).scroll(throttled);