代码之家  ›  专栏  ›  技术社区  ›  Casey Crookston

在计时器上重复/循环ajax调用-即使超时

  •  1
  • Casey Crookston  · 技术社区  · 7 年前

    我们有一个显示板,需要每秒钟更新一次。对服务器的AJAX调用会触发一个存储过程,这是一个非常简单的SELECT语句,执行只需毫秒。

    最初,由于网络延迟(或太阳黑子,或谁知道会发生什么),这个AJAX进程会(偶尔,很少)超时。通过调整处理计时器的方式和设置 timeout 到0,我们有它,所以它现在运行稳定,超时从未发生。。。然而

    尽管如此,我还是很紧张 能够 仍在发生。如果发生这种情况,我们的目标就是继续下去。基本上,忽略超时,然后再试一次。。。永远不像MaxError、RetryLimit或TryCount等。

    以下是我现在拥有的:

    setTimeout(function run() {
        // When the timer elapses, get the data from the server
        GetData();
        setTimeout(run, _refreshRate);
    }, 1000);
    
    
    function GetData() {
        //console.log("Attempting to obtain the data...");
        jQuery.ajax({
            url: "something.ashx",
            type: "GET",
            contentType: 'application/json; charset=utf-8',
            success: function(resultData) {
                //console.log("Got the data.");
                ParseJson(resultData);
                // show the last refresh date and time
                $('#refreshTime').html(GetDateTime());
            },
            error : function(xhr, textStatus, errorThrown) {
                if (textStatus == 'timeout') {
                    //console.log("Timeout occured while getting data from the server.  Trying again.");
                    // If a timeout happens, DON'T STOP. Just keep going forever.
                    $.ajax(this);
                    return;
                }
             },
             timeout: 0,
        });
    }
    

    里面的一切 ParseJson(resultData); 效果很好。没有问题。而且计时器已经设置好了(我相信),所以它会等到一个GetData()完成后再尝试启动另一个。

    我相信通过设置 超时 0 意思是“永远不要超时”

    我的问题是:

    我是否正确处理了 error 超时?我正在使用此帖子中选择的答案作为指导:

    What's the best way to retry an AJAX request on failure using jQuery?

    但我不需要再犯限制。

    我还研究了这些线程:

    How to make the Ajax call again in case Time out error occurs

    ajax timeout callback function

    认为 我已经把所有的信息归结为一个简单的解决方案,但我想要一些同行评议。有没有更好的方法?

    2 回复  |  直到 6 年前
        1
  •  6
  •   Mackan    7 年前

    我更喜欢只在当前呼叫完成时才将新呼叫排队的解决方案。类似于。。

    function poll() {
      setTimeout(function () {
         GetData();
      }, 1000);
    }
    
    function GetData() {
        jQuery.ajax({
            url: "something.ashx",
            type: "GET",
            contentType: 'application/json; charset=utf-8',
            success: function(resultData) {
                //...
            },
            error : function(xhr, textStatus, errorThrown) {
                //...
            },
            complete: function() {
               poll();
            },
            timeout: 0,
        });
    }
    
    poll();
    

    这样,您的通话就不会有重叠的风险。

        2
  •  1
  •   Thomas    7 年前
    function GetData() {
        //console.log("Attempting to obtain the data...");
        jQuery.ajax({
            url: "something.ashx",
            type: "GET",
            contentType: 'application/json; charset=utf-8',
            success: function(resultData) {
                //console.log("Got the data.");
                ParseJson(resultData);
                // show the last refresh date and time
                $('#refreshTime').html(GetDateTime());
            },
            error : function(xhr, textStatus, errorThrown) {
                if (textStatus == 'timeout') {
                    //console.log("Timeout occured while getting data from the server.  Trying again.");
                    // If a timeout happens, DON'T STOP. Just keep going forever.
                    $.ajax(this);
                    return;
                }
             },
             timeout: 0,
        });
    }
    
    var myInterval = setInterval(getData, 1000)
    // if you want to stop it elsewhere:
    // clearInterval(myInterval)
    

    可以使用setInterval代替timeout