为什么setInterval会产生无限循环

时间:2016-05-13 03:47:58

标签: javascript jquery time setinterval

我正在尝试设置一个计时器,以便显示用户的秒数和最小值,我使用setInterval来获取秒数,如果有60秒,它将减少用户1分钟。 问题是,每当我尝试这样做时,我都会得到无限的foorloops。

类似

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);
        }
    }
}

3 个答案:

答案 0 :(得分: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的分钟和秒钟,以便我们知道何时结束我们的计时器。

答案 1 :(得分: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();

答案 2 :(得分: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)