#javascript
#javascript
Вопрос:
Я написал фрагмент кода, включающий if..else
оператор внутри a for-loop
, моей целью было выполнить содержимое else
части через 1 секунду каждой итерации. Например. Я печатаю от 10 до 1. Сначала будет напечатано 10, после 1 секунды будет напечатано 9, а после еще 1 секунды будет напечатано 8 и так далее, пока не будет 0. Итак, мой подход был
Это
pgn
важно.
(function () {
var i, pgn = 0;
for (i = 1; pgn < 10; i ) {
if (i === 1) {
console.log(10);
pgn ;
}
else {
(function countdown() {
var count1 = 9;
var myTimer = setInterval(function () {
console.log(count1);
count1 -= 1;
if (count1 <= 0) {
clearInterval(myTimer);
}
}, 1000);
})()
pgn = 1;
}
}
})()
И это дало мне такой результат,
10
9
9
9
9
and then after several 9s, 8 8 8.. and so on until 0.
А затем из любопытства я заменил pgn = 1;
на pgn =10
, и код работает именно так, как я хотел. Он печатает 10, а затем через секунду 9 и так далее. Может кто-нибудь, пожалуйста, объяснить, как это происходит?
Комментарии:
1.
setInterval
Вызов выглядит корректно. Единственная проблема в том, что вы вызываете его девять раз, а не только один раз.2. @LambdaFairy, не могли бы вы сказать мне, где я вызывал его 9 раз?
Ответ №1:
setInterval
будет вызывать функцию повторно по истечении заданного количества миллисекунд. Когда вы увеличиваете свой цикл, 1
вы создаете несколько таймеров, а не один, и, следовательно, как только истекут все таймеры, они будут регистрировать значение в консоли, но когда вы увеличиваете шаг за 10
шагом, ваш цикл будет выполняться только один раз и будет иметь один таймер.
Все, что вам нужно, это:
var count1 = 10;
var myTimer = setInterval(function () {
console.log(count1);
count1 -= 1;
if (count1 <= 0) {
clearInterval(myTimer);
}
}, 1000);
Комментарии:
1. Да, это так. Теперь я понял. Большое вам спасибо. Пожалуйста, дайте мне положительный результат