2012-03-12 72 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);