setInterval(javaScript):有没有已知的错误?

时间:2011-09-21 11:36:10

标签: javascript delay setinterval

100次中的99次,这非常有效:

function a(){
   setInterval("b()",1000); 
   updateText("still working");
}
function b(){
   timer++;
   updateText(timer);
}

偶尔第一个循环等待20秒到2分钟。此后它完美运行。我知道计时器可以在Android手机上暂停(当显示软键盘时)。还有其他条件可能延迟setInterval吗?

2 个答案:

答案 0 :(得分:10)

首先,强烈建议您提供回调(function)作为第一个参数而不是字符串,因为该字符串在全局范围内进行评估,并且我们都知道在使用{时发生了不好的事情{1}}在js中(相关的评估帖子:When is JavaScript's eval() not evil?) 那么,你的

eval

应改写为:

setInterval("b()", 1000); 

或:

setInterval(b, 1000); 

我还建议您使用setInterval(function() { b(); }, 1000); 来模拟setTimeout

setInterval函数的主要缺点是它每隔setInterval毫秒执行一个代码块,而不管前一代码块的执行情况。
因此,如果出于某种原因n回调执行的时间比提供的延迟要长,则会导致stack overflows

我们以下面的代码为例:

setInterval

这实际上会冻结浏览器,因为它会执行function foo() { // this takes about 2 seconds to execute // .. code here } setInterval(foo, 1000); 几乎无限次,但它永远不会完成它。

此类情况下的解决方案是使用foo模拟setInterval,以确保在再次调用之前回调已完成执行:

setTimeout

现在,只有在前一个实例完成代码执行后才会再次调用function foo() { // this takes about 2 seconds to execute // .. code here } function newSetInterval(callback, duration, callbackArguments) { callback.apply(this, callbackArguments); var args = arguments, scope = this; setTimeout(function() { newSetInterval.apply(scope, args); }, duration); } newSetInterval(foo, 1000);

我会对你的代码应用相同的东西,以便让浏览器决定它何时可以执行代码,而不是强制它执行代码块,因为它在那一刻是忙碌的:

foo

如果您感兴趣,我已经重写了function a() { newSetInterval(b, 1000); updateText("still working"); } function b() { timer++; updateText(timer); } function newSetInterval(callback, duration, callbackArguments) { callback.apply(this, callbackArguments); var args = arguments, scope=this; setTimeout(function() { newSetInterval.apply(scope, args); }, duration); } setInterval函数,以便在任何地方使用它们,而无需考虑堆栈溢出:

clearInterval

答案 1 :(得分:1)

试试这个,

setInterval(b, 1000);

setInterval(function(){
   timer++;
   updateText(timer);
}, 1000);