Я делаю таймер, и по какой-то причине таймер не уменьшается должным образом с помощью функции countDown в приведенном ниже коде. Я использую setTimeout для многократного вызова его countDown, но когда я проверил отладчик, JavaScript даже не переходит к этой строке, после предпоследней строки timeEl.textContent = tempMinutes + ":" + tempSeconds; он просто останавливается. Я пробовал setInterval, но это то же самое. Я хочу знать, как выключить таймер и setTimeout сделать свое дело, но как? Любой совет или помощь приветствуются!

const workBtnEl = document.querySelector("#work-btn");
const shortBreakBtnEl = document.querySelector("#short-break-btn");
const longBreakBtnEl = document.querySelector("#long-break-btn");
let timeEl = document.querySelector("#time");

const work = 25; 
const shortBreak = 5;
const longBreak = 15;

let currentMinutes, currentSeconds = 0;

workBtnEl.addEventListener("click", function() {
    timeEl.textContent = "25:00";
    currentMinutes = work;
    countDown(currentMinutes, 0);
});

function countDown(minutes, seconds) {
    if (seconds == 0) {
        if (minutes == 0) {
            return;
        }
        minutes -= 1;
        seconds = 59;
    }

    let tempSeconds = seconds;
    let tempMinutes = minutes;

    if (seconds < 10) {
        tempSeconds = "0" + seconds;
    }
    if (minutes < 10) {
        tempMinutes = "0" + minutes
    }

    timeEl.textContent = tempMinutes + ":" + tempSeconds;

    let time = setTimeout(countDown, 1000, minutes, seconds);
}
<button id="work-btn">
  Work
</button>
<button id="short-break-btn">
  Short break
</button>
<button id="long-break-btn">
  Long break
</button>

<span id="time">Time</span>
-1
Rachel Kim 16 Сен 2021 в 00:14

3 ответа

Лучший ответ

Вы никогда не уменьшите seconds, если оно не равно нулю.

Так что добавьте это после блока if:

if (seconds == 0) {
   // your code...
} else seconds--;    // <---
5
trincot 15 Сен 2021 в 21:20

Вам нужно уменьшить переменную секунд в функции countDown, иначе в текстовой области каждый раз будет печататься один и тот же текст.

Прямо сейчас у вас есть условие: если секунды равны 0, тогда установите секунды на 59.

1
comp_sci_guy 15 Сен 2021 в 21:27

Посмотрите, что вы сделали в этой строке:

let currentMinutes, currentSeconds = 0;

CurrentMinutes в основном будет неопределенным, я использовал Node REPL, чтобы проверить, есть ли у вас что-то вроде:

let a, b = 0

Значение a не было определено, а b было установлено равным нулю. Соответствующее присвоение будет

let currentMinutes = 0;
let currentSeconds = 0;
0
Danvin 15 Сен 2021 в 21:31