2013-08-17 71 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); 

} 
相關問題