我正在完成一些自学,而在uni假期,并试图使一个freeCodeCamp项目的计时器。我失败的两个测试用例(与相应的错误消息):
1.当会话倒计时达到零时(注:计时器必须达到00:00),则应开始新的中断倒计时,从id=“break-length”元素中当前显示的值开始倒计时。
- 计时器已切换到休息时间,但它没有以正确的值开始。注意:预期4等于5Assert错误:计时器已切换到“中断时间”,但它没有以正确的值启动。注意:预期4等于5*
1.当中断倒计时达到零时(注:计时器必须达到00:00),则应开始新的会话倒计时,从id=“session-length”元素中当前显示的值开始倒计时。
- 计时器已切换回会话时间,但它没有以正确的值开始。注意:应为0等于1Assert错误:计时器已切换回会话时间,但它没有以正确的值开始。0应等于1*
我认为这个问题之所以会发生,是因为在我的代码中,当timeLeft达到0后更新它,然后递归调用startTimer时,下一次通过它时,会在调用displaytimeLeft()之前递减timeLeft。
以下是我遇到问题的函数的代码。
function startTimer() {
intervalId = setInterval(() => {
timeLeft--;
displayTimeLeft();
if (timeLeft === 0) {
audio.play();
clearInterval(intervalId);
if (onBreak) {
onBreak = false;
timeLeft = sessionLengthValue * 60;
document.getElementById("status-label").textContent = "Session";
} else {
onBreak = true;
timeLeft = breakLengthValue * 60;
document.getElementById("status-label").textContent = "Break";
}
startTimer();
}
}, 1000);
}
下面是我的完整代码的codepen链接,其中包含测试用例:
https://codepen.io/LiamJ009/pen/WNKjexB
我尝试了各种方法,最明显的是在递减之前调用displayTimeLeft
,这样当开始5分钟的休息时,显示将从00:00 -〉04:59(因此Assert错误4!= 5),它将短暂地显示05:00,然后递减并重新更新。
然而,每当我尝试这样做时,它最终都会使计时器处于无限循环中,测试用例永远不会完成。
我尝试过为when timeLeft === 1
设置条件,并颠倒更新显示和递减时间的顺序,但它再次以无限循环结束。
1条答案
按热度按时间tjvv9vkg1#
经过一夜好眠之后,我终于找到了一个解决方案,我编辑了startTimer()函数,使其包含以下代码:
timeLeft += 1;
当计时器到达0时,我插入了这个,这样正确的开始时间将被显示并通过测试用例。