2013-08-17 47 views
0

我请鼠标点击下面的代码:为什么clearTimeout不适用于此代码?

clearTimeouts(); 
var inMotion = true, x = 0; 
var shuffleTimer = setTimeout(function(){inMotion = false}, 3500); 
var shuffleStart = setTimeout(oneShuffle, x); 

function oneShuffle(){ 
    x+=5; 
    if(inMotion === true){ 

     console.log('Shuffling again'); 

     //shuffle again 
     shuffleStart = setTimeout(oneShuffle, x); 

    } else { 

     //increment spins 
     spins++; 

     //reset spins if loadOrder been exhausted 
     spins === loadOrder.length ? spins = 0 : 0; 

     console.log(spins); 

    } 
} 

function clearTimeouts(){ 
    console.log('Clearing timeouts') 
    clearTimeout(shuffleTimer); 
    clearTimeout(shuffleStart); 
} 

什么应该发生的事情是,如果我点击elment而inMotiontrue两个超时应该重置和我spins计数器不应该增加对以前的点击。然而,反而会发生什么事情,无论如何,前一次超时都会增加自旋。为什么?

+0

你'的console.log()'调用在那里。你看到的日志输出的顺序是什么? – Pointy

+0

使计时器成为全球? - 也许可以在代码的周围放置一个互斥区域,以便如果您清除超时时间太晚,则不会影响任何内容。 –

回答

2

什么样的定时器应该重置?如果您发布的代码位于点击处理程序中,则每次点击都会生成新的计时器。

的线条:

var shuffleTimer = setTimeout(function(){inMotion = false}, 3500); 
var shuffleStart = setTimeout(oneShuffle, x); 

创造新的计时器每一次,所以第一行(clearTimeouts();),因为计时器不存在,直到接下来的两行是没有意义的。

您应该将两个定时器放在点击处理程序的范围之外,这样所有的点击调用都会引用相同的定时器。此外,所有状态(inMotin,spin等)都应该存在于函数范围之外,否则每次点击都会产生新的,不相关的变量。

+0

Ofcourse - 我仍然有示波器的麻烦。我使他们成为全球性的,他们的工作。谢谢 – styke

+0

@styke您应该真的创建一个包含所有状态(inMotion,spins,shuffleTimer,shuffleStart)的新对象并在外部作用域中使用该对象。不要把所有这些变量放在全局范围内,这是一个BadThing™:)。相反,在外部作用域中创建一个状态对象(在绑定到'click'事件的同一个func中)。 –

0

你应该把讲clearTimeouts()内你如果是这样的:

if(inMotion === true){ 
    clearTimeouts(); 
    console.log('Shuffling again'); 

    //shuffle again 
    shuffleStart = setTimeout(oneShuffle, x); 

} 
相关问题