我有一个ASP.Net网络应用程序,在客户端实现了jquery。在while循环中,客户端jquery脚本对服务器端代码中的Web方法进行异步调用。该调用返回jquery用于更新用户的长时间运行的服务器端任务的状态。目标是让jquery重复调用服务器,直到状态完成,一旦完成它就会跳出while循环并通知用户任务已完成。
我的问题是下面的代码在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;
}
答案 0 :(得分:5)
如下所示?我们的想法是将Ajax调用封装在函数doAjax()
中,然后在Ajax成功处理程序中如果结果为false,则使用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成功处理程序中更新它。)
答案 1 :(得分:0)
Underscore.Js有一个.throttle()
辅助函数:
throttle_.throttle(功能,等待)
在调用时创建并返回传递函数的新的受限制版本 反复,实际上只会调用一次原始函数 每等待几毫秒。对于速率限制事件很有用 发生得比你能跟上的还要快。
var throttled = _.throttle(updatePosition, 100);
$(window).scroll(throttled);