2016-05-13 130 views
0

我想設置一個計時器,以便它顯示用戶的秒數和最小值,我使用setInterval獲取秒數,如果有60秒鐘,它會減少1分鐘用戶。 事情是我每次嘗試去做的時候都會遇到無限的fo lo。爲什麼setInterval使無限循環

var userObj = { 
    name: "", 
    min: 0, 
    sec:0 
} 

function timerCount() { 
    while (userObj.sec !== 0) { 
     console.log(userObj.min) 
     if (userObj.sec == 0) { 
      setInterval(function() { 
       userObj.min--; 
       userObj.sec = 59  
      }, 1000); 
     } 
     while(userObj.sec !== 0) { 
      setInterval(function() { 
       console.log(userObj.sec) 
       userObj.sec--; 
      }, 1000); 
     } 
    } 
} 
+1

你需要在一個變量中存儲'setInterval()'和'clearInterval(變量)'來停止它,否則它會無限調用 – Bhumika107

+0

Javascript in瀏覽器或node.js是一種事件驅動的語言,並且是單線程的,所以你不能在while()循環中循環,並期望執行任何其他的定時器代碼。定時器回調將永遠不會執行,直到完成while()'循環。所以,你不能像這樣循環等待計時器來更新一些東西。計時器永遠不會執行,所以你只會有一個無限循環。 – jfriend00

+1

這裏至少有一些問題。 1)你在while循環中調用setInterval()。 setInterval()設置要重複調用的回調(在你的情況下每1000毫秒)。但是你在while循環中調用了setInterval(),所以你要設置多個並行執行的間隔。 2)setInterval()中的回調函數與代碼的其餘部分異步調用。所以你不能在回調中修改userObj.sec,並且看到它們會以你期望的方式影響你的while循環。 – RJM

回答

0
var userObj = { 
    name: "", 
    min: 0, 
    sec:5 
} 

function timerCount() { 

    if(userObj.min === 0 && userObj.sec === 0) { 
    return; 
    } 

    if (userObj.sec === 0) { 
    userObj.min--; 
     userObj.sec = 59  
    }  
    userObj.sec--; 


    setTimeout(timerCount, 1000) 
} 

timerCount() 

花什麼力氣就可以刪除這些,而導致該問題的循環。我們還想檢查等於0的分鐘和秒數,以便我們知道何時結束計時器。

0

你把你的setInterval放在一個循環(和其他東西)中。

沒有必要在幾分鐘和幾秒鐘內分開時間,只需要秒鐘和做一些數學。

這裏是工作的代碼:

var userObj = { 
    name: "Joe", 
    sec: 3605 
} 

function timerCount() 
{ 
    var interval = setInterval(function() 
    { 
     console.log(getTimeLeft(userObj.sec)); 
     userObj.sec--; 
     if(userObj.sec == 0) 
     { 
      clearInterval(interval); 
      console.log('NO MORE TIME'); 
     } 
    }, 1000); 
} 

function getTimeLeft(sec) 
{ 
    var seconds = Math.floor(sec % 60); 
    var minutes = Math.floor((sec/60) % 60); 
    var hours = Math.floor((sec/60/60)); 

    return { 
     'hours' : hours, 
     'minutes': minutes, 
     'seconds': seconds 
    } 
} 

timerCount(); 
0

這是一個多種方法,你能想到的:

function timer(min, sec){ 
    if (min === 0 && sec === 0) return; 

    setTimeout(function(){ 
     console.log(min, sec); 

     if (min > 0 && sec === 0) timer(min-1, 59); 
     if (sec > 0) timer(min, sec-1); 
    }, 1000); 
} 

您可以調用這個計時器:

timer(userObj.min, 0)