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

我有一块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函数的成功和错误callback,以便循环不会停止。

此外,我认为你不断轮询服务器的回应,然后做适当的行动。 你可以使用Reverse AJAX来做这种处理。

确保你不会无意中在代码的其他地方重新使用相同的定时器名称,这会导致你总是停止定义第二个定时器。

给计时器一个唯一的名字,或者将其范围扩大到一个函数

 var timerForAjax = setInterval(function() { /* Make Ajax Calls and set stopTimer */ if (stopTimer) { clearInterval(timerForAjax); } }, 10000); 

我不小心打电话给我的定时器interval ,并没有意识到我在同一个范围内创build两个定时器,都称为interval 。 指责iOS8大约一个小时,直到我意识到这是无关的。