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

时间:2010-03-16 04:41:32

标签: javascript timer

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

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

    /* Make Ajax Calls and set stopTimer */

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

然而,我发现不稳定的行为:有时会工作,但在其他时候,它会一直检查。我已经检查过(尽可能多)代码的任何部分都没有错误。

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

感谢您的关注

3 个答案:

答案 0 :(得分:19)

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

答案 1 :(得分:3)

我不认为你的代码会有任何问题,除非AJAX函数是错误的。您必须处理AJAX函数的成功和错误回调,以便循环不会出现任何问题。

此外,我认为您不断轮询服务器以获取响应,然后执行相应的操作。您可以使用 Reverse AJAX 来执行此类过程。

答案 2 :(得分:2)

确保您不会无意中在代码中的其他位置重复使用相同的计时器名称,这将导致您始终停止定义第二个计时器。

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

var timerForAjax = setInterval(function() {

    /* Make Ajax Calls and set stopTimer */

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

我不小心打电话给我的计时器interval并且没有意识到我在同一范围内创建了两个名为interval的计时器。将iOS8归咎于大约一个小时,直到我意识到that与它无关。