2016-05-13 85 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)