我有一個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;
}
我想補充'的setTimeout(doAjax,2000);'到錯誤處理程序函數一樣,所以請求的鏈不破如果Ajax請求timesout之一。 – shaun5 2012-03-12 03:03:17
@ shaun5 - 我想這取決於OP是否合適,但我在我的解釋中提到了它。 (我可能不會在誤差情況下超時,但因爲已經有一個提醒,所以在用戶處理時會稍微延遲一點。最好將alert改爲一個關於是否要重試的確認消息或中止。) – nnnnnn 2012-03-12 03:09:23
@nnnnnn - 這很奇妙,沒想到要使用遞歸調用。我唯一擔心的是,客戶端緩衝區或其他緩存介質jQuery是否會使用它來存儲其函數隊列(對於不完全瞭解jQuery如何存儲隊列引用),被填充甚至溢出,尤其是在處理任務很長的情況下在服務器端?只是好奇這是否會成爲問題。再次感謝。 – kingrichard2005 2012-03-12 05:00:08