重复的AJAX调用web方法之间的延迟

时间:2012-03-12 01:50:38

标签: javascript jquery asp.net ajax

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

2 个答案:

答案 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);