对setInterval计时器的Ajax调用不起作用

时间:2017-12-10 04:32:50

标签: javascript jquery ajax

我应该是一个非常简单的小过程。我有一个间隔计时器,当它到期时,对服务器进行ajax调用。随着json返回,它解析出来并更新DOM。 setInterval设置为一秒。然后,服务器对数据库执行非常简单的SELECT。它执行一个需要几毫秒才能执行的查询,如果是这样的话。

在我们的测试服务器上,它运行正常。但是,当它部署到我们的客户时,大部分时间都没有实际访问数据库。我们可以在查询分析器中看到它。应该有连续的查询流,但它们最多是零星的,通常是两次或更多次点击。

以下是代码:

setTimeout(function run() {
    // When the timer elapses, get the data from the server
    GetData(0);
    setTimeout(run, _refreshRate);
}, 1000);


function GetData(isFirstLoad) {
    //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);内的所有内容都可以正常运行。用这条线......

$('#refreshTime').html(GetDateTime());

......即使数据库永远不会被击中,时间也会像钟表一样每秒刷新一次。

我可以在error内的调试工具中放置一个断点,它永远不会被击中。

如果我们点击刷新,它会工作或几秒钟(我们可以看到查询到达数据库),但随后又会慢下来。

令人沮丧的是,它在我们的测试服务器上完美运行。但显然我忽视了一些事情。

修改

好的,这真的很奇怪。当我打开调试器时,它可以工作。一旦我关闭调试器,它就会停止工作。我甚至不必运行网络选项卡并捕获事件。只需打开调试器窗口即可使用。

这是IE,这是客户使用的,所以它是我们唯一的选择。

1 个答案:

答案 0 :(得分:2)

在这里找到答案:

jQuery ajax only works in IE when the IE debugger is open

结果是iE,只有IE,才会缓存ajax响应。你必须告诉它不要。添加cache: false就可以了。

function GetData(isFirstLoad) {
    //console.log("Attempting to obtain the data...");
    jQuery.ajax({
        url: "something.ashx",
        type: "GET",
        contentType: 'application/json; charset=utf-8',
        cache: false,  
        success: function(resultData) {