首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对web方法的重复AJAX调用之间的延迟

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

Stack Overflow用户
提问于 2012-03-12 09:50:38
回答 2查看 5K关注 0票数 1

我有一个在客户端实现了jquery的ASP.Net web应用程序。在while循环中,客户端jquery脚本对服务器端代码中的web方法进行异步调用。该调用返回一个长时间运行的服务器端任务的状态,jquery使用该任务更新用户。目标是让jquery重复调用服务器,直到状态为完成,一旦完成,它就会中断while循环,并通知用户任务已经完成。

我的问题是下面的代码在while循环中运行,但我想让它在每次调用之间延迟或休眠,以防止状态请求压倒服务器。我尝试在下面的代码中调用setTimeout,但它只在最初的ajax调用中起作用,后续的调用都是背靠背发生的。是否有一种方法可以有效地延迟每次对服务器的后续调用?这是实现我所描述的那种行为的最有效的方法吗?理想情况下,我希望每次调用之间有2-5秒的延迟。

我有以下代码

客户端Jquery:

代码语言:javascript
复制
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

代码语言:javascript
复制
[System.Web.Services.WebMethod]
        public static bool GetStatus()
        {
            return result;
        }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-12 09:58:21

下面的内容如何?其思想是将Ajax调用封装在函数doAjax()中,然后在Ajax成功处理程序中,如果结果为false,则使用setTimeout()将另一个对doAjax的调用排入队列,否则将采取任何操作以获得正确的结果。(您也可以选择从Ajax错误处理程序调用doAjax()。)

代码语言:javascript
复制
$('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成功处理程序中对其进行更新。)

票数 4
EN

Stack Overflow用户

发布于 2012-03-12 10:05:52

Underscore.Js有一个.throttle()助手函数:

throttle_.throttle(function,wait)

创建并返回传递函数的一个新的限制版本,当重复调用该函数时,实际上每等待毫秒最多调用一次原始函数。对于发生速度快于您所能跟得上的速率限制事件非常有用。

代码语言:javascript
复制
var throttled = _.throttle(updatePosition, 100);
$(window).scroll(throttled);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9660819

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档