2017-06-01 84 views
0

我正在倒數計時器。當我取出setInterval()函數並在不暫停的情況下遞減時間時,程序正常工作。setInterval定時器功能不工作

但是,當我使用setInterval()函數來調用每秒只減少我的時間的代碼時,程序掛起。

function timeControl() { 
    var minutesLeft = $('#minutes').text(); 
    var secondsLeft = $('#seconds').text(); 

    while(Number(minutesLeft) > 0 || Number(secondsLeft) > 0) { 
     window.setInterval(decreaseTime, 1000); 

     minutesLeft = $('#minutes').text(); 
     secondsLeft = $('#seconds').text(); 
    } 
} 


function decreaseTime() { 
    var secondsLeft = $('#seconds').text(); 
    var minutesLeft = $('#minutes').text(); 
    if((Number(minutesLeft) > 0) && (Number(secondsLeft) == 0)) { 
    $('#minutes').text(Number(minutesLeft) - 1); 
    $('#seconds').text(4); 
    } else { 
     $('#seconds').text(Number(secondsLeft) - 1); 
    } 
} 
+2

''setInterval'是異步的,所以你的代碼沒有更新元素,所以你有一個無限循環。 –

+1

這不是你應該如何使用'setInterval()'。不要有一個'while'循環,它依賴於預定的東西,它永遠不會終止。 –

+2

[爲什麼setInterval會造成無限循環](https://stackoverflow.com/questions/37200897/why-is-setinterval-making-infinite-loops) –

回答

2

你加while並循環速度非常快,所以你setInterval()調用很多次,所以瀏覽器掛。您不需要同時運行,因爲setInterval每次運行時都會在setInterval的第二個參數中定義。您可以使用下面的代碼:

var decreaseTimeInterval; 
function timeControl() { 
    decreaseTimeInterval = window.setInterval(decreaseTime, 1000); 
} 

function decreaseTime() { 
    var secondsLeft = $('#seconds').text(); 
    var minutesLeft = $('#minutes').text(); 
    if((Number(minutesLeft) > 0) && (Number(secondsLeft) == 0)) { 
     $('#minutes').text(Number(minutesLeft) - 1); 
     $('#seconds').text(4); 
    } else if(Number(minutesLeft) == 0 && Number(secondsLeft) == 0) { //end of script 
     clearInterval(decreaseTimeInterval); //clear interval to prevent do again 
    } else { 
     $('#seconds').text(Number(secondsLeft) - 1); 
    } 
} 
1

你似乎與同步sleep種功能混爲一談異步setInterval功能。他們完全不同。 setInterval函數爲你設置一個計時器。它說,「每y毫秒運行一次函數x」。但是在這裏,你在while循環中設置了這個函數的次數不等。本質上,你開始設置越來越多的定時器,數百或數千個定時器,每個定時器每1秒鐘運行一次decreaseTime函數,直到程序掛起。

你想要做的就是將setInterval函數放在程序的頂層,並讓它每1000毫秒運行一次timeControl函數。從timeControl函數中刪除while循環 - 你不需要它,因爲setInterval函數本身正在爲你運行一個循環。但是,您需要將返回值setInterval保存在變量中,以便在達到停止條件時清除它。總之,閱讀更多關於setInterval:這是一個與sleep完全不同的概念。