我有一个在客户端实现了jquery的ASP.Net web应用程序。在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;
}发布于 2012-03-12 09:58:21
下面的内容如何?其思想是将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成功处理程序中对其进行更新。)
发布于 2012-03-12 10:05:52
Underscore.Js有一个.throttle()助手函数:
throttle_.throttle(function,wait)
创建并返回传递函数的一个新的限制版本,当重复调用该函数时,实际上每等待毫秒最多调用一次原始函数。对于发生速度快于您所能跟得上的速率限制事件非常有用。
var throttled = _.throttle(updatePosition, 100);
$(window).scroll(throttled);https://stackoverflow.com/questions/9660819
复制相似问题