2017-06-01 83 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完全不同的概念。