2010-09-30 95 views
0

我有一个计时器以10秒为间隔在我的页面上。它使用setTimeout(“myWork()”,10000)创建。它完美的作品。在某些情况下,根据某些条件,我会清除此间隔并创建一个新的间隔,间隔为1秒。Chrome上的JavaScript clearTimeout问题

var tenSecTimer = 0; 

if (myCondition) 
{ 
    clearTimeout(tenSecTimer); 
    tenSecTimer = setTimeout("myWork()", 1000); 
} 

这整个过程在所有版本的IE和FireFox上都能正常工作。当我在Chrome(6.0)中打开此页面时,在clearTimeout被调用后,ticker停止工作。它永远不会识别1s计时器。

我缺少最新的铬?

感谢

+0

myWork是一个全局函数吗? – methodin 2010-09-30 13:22:32

回答

0

不是一个答案,但完整的代码表现出相同的行为:

(function() { 
var counter = 0; 

function testCounter() { 
    if (counter === 2) { 
    clearInterval (timer); 
    timer = setInterval (myWork, 1000); 
    } 

    else if (counter === 5) 
    clearInterval (timer); 
} 

function myWork() { 
    document.body.innerHTML += ++counter + ' ' + Date() +'<br/>'; 
} 

document.body.innerHTML += 'Starting ' + Date() +'<br/>'; 
var timer = setInterval (myWork, 10000); 
setInterval (testCounter, 500); 
})(); 

此代码显示:

Starting Thu Sep 30 2010 16:15:09 GMT+0200 (CEST) 
1 Thu Sep 30 2010 16:15:19 GMT+0200 (CEST) 
2 Thu Sep 30 2010 16:15:29 GMT+0200 (CEST) 

,并没有更多的,如果我删除的setInterval上testCounter并在myWork中调用它我得到以下内容:

Starting Thu Sep 30 2010 16:20:50 GMT+0200 (CEST) 
1 Thu Sep 30 2010 16:21:00 GMT+0200 (CEST) 
2 Thu Sep 30 2010 16:21:10 GMT+0200 (CEST) 
3 Thu Sep 30 2010 16:21:11 GMT+0200 (CEST) 
4 Thu Sep 30 2010 16:21:12 GMT+0200 (CEST) 
5 Thu Sep 30 2010 16:21:13 GMT+0200 (CEST) 

非常好奇.....

+0

P.S.如果使用重新触发的setTimeout而不是setInterval,我会得到相同的结果。 – HBP 2010-09-30 14:44:18

+0

PPS:我解决了我的代码问题:计数器值为2时,testCounter不断触发并清除/设置myWork的setInterval,因此从未触发。我怀疑ByteBlocks有类似的情况。 – HBP 2010-09-30 14:44:51

+0

这是我们曾考虑采取的解决方法之一。但我很好奇为什么会发生这种情况。与浏览器内部的某种竞争情况有关,因为下一次来电会导致以前的回拨被中断? 1s tick对于这种行为来说并不是太快。 – ByteBlocks 2010-09-30 17:27:51

0

我怀疑这会解决它,但你试过路过的参考,而不是一个字符串进行评估?

setTimeout(myWork, 1000) 
+0

如果是这种情况,它也不适用于10秒间隔计时器。它只在我清除计时器并重新创建1秒时停止。 – ByteBlocks 2010-09-30 13:14:31

+0

你可以发布* full *代码,包括'myWork'功能吗? – 2010-09-30 13:16:16

0

我不知道你的代码的其余部分的样子,但你可能使用的setInterval()代替setTimeout()会更好。签名模式相同,但setInterval自动处理重复。

1

为什么不使用这个?

var tenSecTimer = 0; 

if (myCondition) { 
    clearTimeout(tenSecTimer); 
    tenSecTimer = setTimeout(function() { 
     myWork(); 
    }, 1000); 
} 

注意:它传入一个函数,然后执行myWork函数。使用setTimeout或setInterval字符串很糟糕,因为它然后调用eval(这很慢,并且有其他问题)。

Source (scroll all the way to the bottom)

0

我想我已经解决了这个问题的奥秘。从韩的评论中得到启发,我意识到实际的代码在做什么。我有一个1s时钟定时器,它产生了清除10s定时器,然后为“myWork”启动1s定时器的条件。在唤醒1s计时器之前,另一个时钟发生了。现在清除了正在等待“myWork”的计时器。所以它几乎进入了一个永无止境的循环。看起来Chrome的定时器已经变得非常有效了:-)解决这个问题的关键是要么将“myWork”的定时器设置为小于1s,要么有一个状态机来确保定时器在其之前未被清除已执行。