Почему консоль выводит 4? А не 3 (setInterval+setTimout)

Всем привет, кто может объяснить порядок выполнения кода? Ожидалось увидеть 3, но я что-то упускаю. Хотелось бы разобраться.

let i = 0;

let t  = setInterval(()=>{
     setTimeout(()=>{
         clearInterval(t);
     },3000)
     console.log(++i);
 },1000);

Буду благодарна за ответы:)


Ответы (2 шт):

Автор решения: Roman

Каждую секунду выводится инкрементированное значение i, спустя 3 секунды срабатывает clearInterval и после этого setInterval уже не будет вызывать функцию, которая инкрементирует значение i. Вы не контролируете сколько значений выведется, вы контролируете только время.

Но как вариант можно уменьшить время, через которое setInterval прекратит свое выполнение

let i = 0;

let t  = setInterval(()=>{
     setTimeout(()=>{
         clearInterval(t);
     },2000)
     console.log(++i);
 },1000);

→ Ссылка
Автор решения: Aziz Umarov

Давайте считать.

  1. Вызов setInterval запуск таймера с интервалом 1 сек.
  2. Сработка t. Планировка закрытие t через 3 сек
  3. Вывод на печать 1
  4. Запуск второй раз Timera. Вывод на печать 2. Поскольку проходит первая секунда первого Timeout.
  5. Запуск третий раз Timera. Вывод на печать 3. Проходит вторая секунда первого Timeouta.
  6. Запуск четвертый раз Timera. Вывод на печать 4. Проходит третья секунда первого Timeouta.
  7. Остановка t вывод первой 4-
  8. Ну и три сработки оставшихся Timeoutов.

let i = 0;

let t  = setInterval(()=>{
     setTimeout(()=>{
         console.log(i, "-");
         clearInterval(t);
     },3000)
     console.log(++i);
 },1000);

→ Ссылка