Javascript计时器无法正常工作/难以处理测试用例

31moq8wy  于 2023-01-16  发布在  Java
关注(0)|答案(1)|浏览(129)

我正在完成一些自学,而在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设置条件,并颠倒更新显示和递减时间的顺序,但它再次以无限循环结束。

tjvv9vkg

tjvv9vkg1#

经过一夜好眠之后,我终于找到了一个解决方案,我编辑了startTimer()函数,使其包含以下代码:
timeLeft += 1;
当计时器到达0时,我插入了这个,这样正确的开始时间将被显示并通过测试用例。

相关问题