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

Javascript 在计时器上重复/循环ajax调用-即使超时,javascript,jquery,ajax,settimeout,Javascript,Jquery,Ajax,Settimeout,我们有一个显示板,需要每秒钟更新一次。对服务器的AJAX调用触发一个存储的proc,这是一个非常简单的SELECT语句,执行只需几毫秒 最初,由于网络延迟(或太阳黑子,或谁知道会发生什么),这个AJAX过程会(偶尔,很少)超时。通过调整我们处理计时器的方式,并将超时设置为0,我们得到了它,因此它现在运行稳定,并且不会发生超时。。。然而 尽管如此,我仍然担心暂停仍然会发生。如果真的发生了,我们的目标就是让它继续下去。基本上,忽略超时,然后再试一次。。。永远不像MaxError、RetryLimit

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

最初,由于网络延迟(或太阳黑子,或谁知道会发生什么),这个AJAX过程会(偶尔,很少)超时。通过调整我们处理计时器的方式,并将
超时设置为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
,它意味着“永远不要超时”

我的问题是:

我是否正确处理了超时的
错误
?我使用此线程中的选定答案作为指南:

但我不需要再起诉的限制

我还研究了这些线程:


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

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

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();

这样,您的呼叫无论如何都不会有重叠的风险。

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

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();
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)
这样,您的呼叫无论如何都不会有重叠的风险

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



从外观上看,可以使用setInterval,而不是timeout,它应该已经发生了。您的
run
功能设置为每1秒执行一次。而且它设置在ajax调用的范围之外,所以ajax调用是否超时并不重要。你们试过调试这个吗?每秒钟都会给服务器带来沉重的负载。你真的应该使用WebSocket来做这件事this@MattSpinks-是的,很多。经过多次尝试和错误,我们达到了这一点,现在它似乎是稳定的。我的意思是,它不再超时。至少,我们让它运行了几个小时,并对它进行了大量测试,但它从未超时,而在这之前,它每隔几分钟就会超时一次。所以我认为我们很好。大多数情况下,我只是在寻找同行对如何改进的建议,或者这段代码中是否存在潜在的gotchya。@charlietfl,谢谢!我真的很欣赏这个主意。我承认我没有想到WebSocket,但这可能是一个更好的解决方案。好消息是运行的SP非常小。我们在SQL查询分析器和探查器中对其进行了各种测试,数据库服务器上的负载几乎不存在。那么,问题是:WebSocket如何帮助降低web服务器上的负载?好的,很好。我可能会改变您的机制,从
success
error
函数内部进行轮询,而不是在
run
函数中进行轮询。这样做的原因是,如果存在任何类型的网络错误,那么即使最后一个请求尚未返回,代码也不会盲目地发送更多请求。从外观上看,这应该已经发生了。您的
run
功能设置为每1秒执行一次。而且它设置在ajax调用的范围之外,所以ajax调用是否超时并不重要。你们试过调试这个吗?每秒钟都会给服务器带来沉重的负载。你真的应该使用WebSocket来做这件事this@MattSpinks-是的,很多。经过多次尝试和错误,我们达到了这一点,现在它似乎是稳定的。我的意思是,它不再超时。至少,我们让它运行了几个小时,并对它进行了大量测试,但它从未超时,而在这之前,它每隔几分钟就会超时一次。所以我认为我们很好。大多数情况下,我只是在寻找同行对如何改进的建议,或者这段代码中是否存在潜在的gotchya。@charlietfl,谢谢!我真的很欣赏这个主意。我承认我没有想到WebSocket,但这可能是一个更好的解决方案。好消息是运行的SP非常小。我们在SQL查询分析器和探查器中对其进行了各种测试,数据库服务器上的负载几乎不存在。那么,问题是:WebSocket如何帮助降低web服务器上的负载?好的,很好。我可能会改变您的机制,从
success
error
函数内部进行轮询,而不是在
run
函数中进行轮询。这样做的原因是,如果存在任何类型的网络错误,那么即使最后一个请求尚未返回,代码也不会盲目地发送更多请求。好的,这是有意义的。然后第一次从$(document).ready()内部调用
poll()
?@CaseyCrookston是的,这将是advisableOk,
complete
函数调用poll(),即使出现错误。对吗?@caseycrokston完全正确。但是有一件事:调用
$.ajax(这是)(我假设执行新调用)。这是不需要的,因为完整的处理程序将在一秒钟后启动一个新的调用(错误与否)。是的,理解。这更优雅。我正在测试这个。非常感谢!!!好的,这是有道理的。然后第一次从$(document).ready()内部调用
poll()
?@CaseyCrookston是的,这将是advisableOk,
complete
函数调用poll(),即使出现错误。对吗?@caseycrokston完全正确。但是有一件事:调用
$.ajax(这是)(我假设做一个新的cal