100次中的99次,这非常有效:
function a(){
setInterval("b()",1000);
updateText("still working");
}
function b(){
timer++;
updateText(timer);
}
偶尔第一个循环等待20秒到2分钟。此后它完美运行。我知道计时器可以在Android手机上暂停(当显示软键盘时)。还有其他条件可能延迟setInterval吗?
答案 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);