【问题标题】:Interval gets blocked with two Ajax Calls间隔被两个 Ajax 调用阻塞
【发布时间】:2012-06-01 13:10:36
【问题描述】:

我有一个间隔,它每 3 秒运行一次函数。

intervalStepper = window.setInterval('intervalTick()','3000');

function intervalTick() {
    if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();
    }
    else {// code for IE6, IE5
        xmlhttp=new ActiveXObject('Microsoft.XMLHTTP');
    }
    xmlhttp.onreadystatechange=function() {
        if (xmlhttp.readyState==4 && xmlhttp.status==200) {
            gotResult(xmlhttp.responseText);
        }
    }
    xmlhttp.open('GET','index.php?ajax=true',true);
    xmlhttp.send();
}
function gotResult(res) {
    alert(res);
}

另外,我还有另一个 Ajax 调用,它在按钮单击时运行。

if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
    xmlhttp=new XMLHttpRequest();
}
else {// code for IE6, IE5
    xmlhttp=new ActiveXObject('Microsoft.XMLHTTP');
}
xmlhttp.onreadystatechange=function() {
    if (xmlhttp.readyState==4 && xmlhttp.status==200) {
        agentDetailGotten(xmlhttp.responseText);
    }
}
xmlhttp.open('GET','index.php?anotherPage=true',true);
xmlhttp.send();

现在,如果我在时间间隔滴答作响并执行第一个调用时及时运行第二个代码,那么这些调用实际上几乎在同一时间运行。但后来似乎间隔以某种方式消失了——他不再滴答作响了。

这是一个已知问题还是我只是没有看到什么大问题...

感谢您的帮助!

【问题讨论】:

  • 您将 all 变量声明为隐式全局变量。使用 var 语句将 xmlhttp 请求本地化到您的 intervalTick() 函数。这不会解决您的问题,但不会有帮助。
  • 此外,您应该永远将字符串传递给setTimeout/setInterval:改用window.setInterval(intervalTick,'3000');。欲了解更多信息,请参阅here
  • 哦,setTimeoutsetInterval 的超时值应该是整数,而不是字符串,所以使用 window.setInterval(intervalTick, 3000);

标签: javascript ajax intervals


【解决方案1】:

尝试再次清除并设置间隔:

intervalStepper = window.setInterval('intervalTick()',3000);

function intervalTick() {

    window.clearInterval(intervalStepper);

    if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();
    }
    else {// code for IE6, IE5
        xmlhttp=new ActiveXObject('Microsoft.XMLHTTP');
    }
    xmlhttp.onreadystatechange=function() {
        if (xmlhttp.readyState==4 && xmlhttp.status==200) {
            gotResult(xmlhttp.responseText);
        }
    }
    xmlhttp.open('GET','index.php?ajax=true',true);
    xmlhttp.send();

    intervalStepper = window.setInterval('intervalTick()',3000);

}

function gotResult(res) {
    alert(res);
}

【讨论】:

    【解决方案2】:

    我刚刚解决了。

    这似乎有点像 firefox 错误(在 bugzilla.mozilla.org 上找到)

    NS_ERROR_NOT_AVAILABLE

    这个没有显示给我,但我现在才找到。它在 Firefox 尝试同时执行两个调用时出现。

    更多信息,我找到了一个博客条目here

    我解决了如果一个呼叫正在运行,另一个等待。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-16
      • 2014-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-11
      相关资源
      最近更新 更多