Intervals - как таймауты, которые будут перенести себя (что differs с таймаутом, начиная новый таймаут). Поскольку интервалы перепланируют сами, создать только один. (Или, только столько, сколько действительно необходимо.)
Проблемы с оригинальным постом он создавал интервалов (потому что они были созданы в цикле), а затем только сохраняя интервал ID (в counter
) от последнего интервала! Таким образом, clearInterval
остановился только последний интервал и остальные 4 интервалов продолжал работать и работает, и работает ..
Вот некоторые очистке кода с комментариями и без исходной задачи:
var count = 5;
// only need ONE interval
var counter = setInterval(timer, 1000);
// so we do one count RIGHT NOW
timer();
function timer() {
// display first, so we start at 5: 5, 4 .. 1
console.log(count);
count--;
if (count < 0) {
// to repeat the count, comment out the clearInterval
// and do `count = 5;` or similar .. take it from here :D
clearInterval(counter);
}
}
Чтобы создать отдельный " state "для каждого обратного отсчета, либо создайте новый объект обратного отсчета, который сохраняет состояние в свойствах, либо use a closure. Вот пример с закрытием. Я также добавил поддержку функции обратного вызова, чтобы показать, как такая функция может быть более общее:
function makeCountdown(startCount, delay, fn) {
fn = fn || function (i) {
// default action, if fn not specified
console.log(i);
};
// local variables
var count = startCount;
var counter = setInterval(timer, delay);
timer();
function timer() {
// now count and counter refer to variables in the closure (keyword!)
// which are different each time makeCountdown is called.
fn(count);
count--;
if (count < 0) {
clearInterval(counter);
}
}
}
makeCountdown(20, 500); // uses default function
makeCountdown(10, 1000, function (i) { console.log(10 - i) });
makeCountdown(5, 2000, function (i) { console.log("SLOW! " + i) });
упражнение:
- Добавить функцию обратного вызова для того, когда обратный отсчет «сделан», так что обратные отсчеты могут запускаться последовательно.
- Используйте генератор серий и используйте его для генерации следующего значения
count
.
- Иметь
makeCountdown
вернуть объект, который может использоваться для управления обратным отсчетом.
- Удачи!
Не создавайте 5 интервалов. Создайте один (без цикла). – user2246674
Почему бы не использовать 'setTimeout'? – akonsu
@ user2246674 Что это значит? – akonsu