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

Cas*_*ton 1 javascript ajax jquery settimeout

我们有一个需要每秒更新的显示板.对服务器的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,
    });
}
Run Code Online (Sandbox Code Playgroud)

里面的一切都ParseJson(resultData);很棒.没问题.并设置计时器(我相信),以便它等待一个GetData()完成后再尝试启动另一个.

我相信,通过设置timeout0它的意思是"永远不要超时."

我的问题是:

我是否正确处理error超时?我在这个帖子中使用选定的答案作为我的向导:

使用jQuery在失败时重试AJAX请求的最佳方法是什么?

但我不需要retryLimit限制.

我也看了这些线程:

如果发生超时错误,如何再次进行Ajax调用

ajax超时回调函数

我已将所有信息归结为一个简单的解决方案,但我想进行一些同行评审.有一个更好的方法吗?

Mac*_*kan 5

我更喜欢一种解决方案,它只在当前完成时排队新呼叫.就像是..

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();
Run Code Online (Sandbox Code Playgroud)

这样,您的通话无论如何都不会有重叠的风险.