Javascript 在setInterval处理程序中调用clearInterval可以吗?

Javascript 在setInterval处理程序中调用clearInterval可以吗?,javascript,timer,Javascript,Timer,我有一段Javascript,它每n秒检查一个条件(通过AJAX调用)。如果该条件为真,则停止检查。我已通过以下方式实施: var stopTimer; var timerId = setInterval(function() { /* Make Ajax Calls and set stopTimer */ if (stopTimer) { clearInterval(timerId); } }, 10000); 然而,我发现不稳定的行为:有时有效

我有一段Javascript,它每n秒检查一个条件(通过AJAX调用)。如果该条件为真,则停止检查。我已通过以下方式实施:

var stopTimer;
var timerId = setInterval(function() {

    /* Make Ajax Calls and set stopTimer */

    if (stopTimer) {
        clearInterval(timerId);
    }
}, 10000);
然而,我发现不稳定的行为:有时有效,但在其他时候,它会永远检查。我已经检查过(尽可能多地)代码的任何部分都没有错误

因此,我怀疑在setInterval处理程序中调用clearInterval可能是罪魁祸首。是这样吗?在setInterval处理程序中调用clearInterval可以吗


谢谢您的关注

很安全。问题可能与stopTimer未按预期设置有关。

我认为您的代码不会有任何问题,除非AJAX函数出错。您必须注意AJAX函数的成功和错误回调,这样就不会出现循环未停止的问题


另外,我认为您一直在轮询服务器以获得响应,然后执行适当的操作。您可以使用来执行此类过程。

确保您没有无意中在代码的其他地方重复使用相同的计时器名称,这将导致您始终停止要定义的第二个计时器

为计时器指定一个唯一的名称,或将其作用域指定给函数

var timerForAjax = setInterval(function() {

    /* Make Ajax Calls and set stopTimer */

    if (stopTimer) 
    {
        clearInterval(timerForAjax);
    }
}, 10000);

我很粗心地调用了我的计时器
interval
,没有意识到我在同一范围内创建了两个计时器,它们都被称为
interval
。责怪iOS8大约一个小时,直到我意识到这与它无关。

谢谢。将检查并共享查找记录。是的,Ajax完成的往返时间可能会干扰setInterval设置的重复间隔。如果这就是你当时所做的,那就可以解释为什么它会永远被检查