【问题标题】:Ajax call on setInterval timer not working对 setInterval 计时器的 Ajax 调用不起作用
【发布时间】:2018-05-23 23:17:27
【问题描述】:

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

在我们的测试服务器上,它运行良好。但是当它被部署到我们的客户时,大部分时间并没有真正访问数据库。我们可以在查询分析器中看到它。应该有连续的查询流,但它们充其量是零星的,通常是 40 秒或更长时间。

代码如下:

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,这是客户端使用的,所以这是我们唯一的选择。

【问题讨论】:

  • 什么是$.ajax(this);??是否调用了错误回调?顺便说一句,如果整个事情在另一个部署中都很好,你几乎不能指望它是一个编程问题......
  • 我在这里的另一个线程上发现了这一点,同时试图弄清楚如何让 ajax 调用在超时时简单地再次执行。
  • 话虽如此,我可以在我的测试服务器和客户端的生产服务器上设置一个断点,并且它永远不会被命中。一旦设置了timeout:0,它就再也不会超时......我认为很好。
  • 从来没有听说过,我非常怀疑它会这样做。 this 的设置取决于 JS 上下文,因此该行可能会导致错误或意外行为。
  • 尝试把url改成这个表单url: "something.ashx?"+(new Date().getTime())

标签: javascript jquery ajax


【解决方案1】:

在这里找到答案:

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) {

【讨论】:

  • :) 这不会是你的最后一个“啊,它是缓存!”问题,相信我!
  • 如果你愿意教育我,我会全力以赴!!
  • 我已经更改了计时器的处理方式,使其不会重叠,而是等到一个任务完成后再开始下一个任务。这样做可以使该过程不再超时。 (更改反映在 OP 中)所以唯一剩下的(我能说的)可能是一个问题,如果由于某种原因确实发生超时,如何处理。
  • 哦,我只是说缓存问题会在许多其他变体中弹出,无论是 javascript 还是任何编程语言。主要是“我认为这是最新信息”,但“我们让它使用了缓存,所以它的速度很快,所以它不是”......然而,在调试 javascript 时,Firefox 和 Chrome 都可以选择“在开发人员工具时禁用缓存”是开放的”,我强烈建议这样做。
猜你喜欢
  • 2012-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-24
  • 1970-01-01
  • 1970-01-01
  • 2021-04-07
相关资源
最近更新 更多