Печать интервала setInterval несколько раз

#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. Да, это так. Теперь я понял. Большое вам спасибо. Пожалуйста, дайте мне положительный результат