为什么 setInterval 会无限循环
Why is setInterval making infinite loops
我正在尝试设置一个计时器,以便它显示用户剩余的秒数和分钟数,我正在使用 setInterval
来获取秒数,如果还有 60 秒,它将减少 1 分钟用户。
问题是每次我尝试这样做时,我都会得到无限的 for
循环。
类似
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);
}
}
}
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()
我们可以毫不费力地删除导致问题的那些 while 循环。我们还想检查分钟和秒是否等于 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();
这是您可以想到的另一种方法:
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)
我正在尝试设置一个计时器,以便它显示用户剩余的秒数和分钟数,我正在使用 setInterval
来获取秒数,如果还有 60 秒,它将减少 1 分钟用户。
问题是每次我尝试这样做时,我都会得到无限的 for
循环。
类似
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);
}
}
}
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()
我们可以毫不费力地删除导致问题的那些 while 循环。我们还想检查分钟和秒是否等于 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();
这是您可以想到的另一种方法:
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)