我有一个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