почему не срабатывает clearTimeout?

111
21 апреля 2021, 18:00

function printNumbersInterval(){ 
  var d = 1; 
var s = setTimeout(function f(){ 
  if (d > 20){ 
    clearTimeout(s); 
  } 
   console.log(d++); 
  s = setTimeout(f, 100) 
}, 100) 
 
}; 
 
console.log( printNumbersInterval() );

Answer 1

Это связано с тем, что после очистки setTimeout, код идет выполняться ниже, а у вас там присваивание нового setTimeout.

Что бы этого избежать, у вас есть 2 выхода:

  1. После очистки setTimeout ниже написать return, что бы функция прекратила свое выполнение на этом месте.
  2. Или же по другому сделать условия через if, else.

Ниже в коде я оставил комментарии.

P.S: Stepan Kasyanenko в ответе правильно написал, что можно обойти и без очистки setTimeout.

function printNumbersInterval() { 
  var d = 1; 
  var s = setTimeout(function f() { 
    if (d > 20) { 
      clearTimeout(s); 
      return; //Все что ниже не будет выполнено. 
    } 
    console.log(d++); 
    s = setTimeout(f, 100) 
  }, 100) 
 
}; 
 
//или сделать условия if, else 
 
//if (d > 20) { 
//  clearTimeout(s); 
//} else { 
//  console.log(d++); 
//  s = setTimeout(f, 100) 
//} 
 
console.log(printNumbersInterval());

Answer 2

Вам здесь clearTimeout не нужен. Просто не запускайте следующий setTimeout, если он не нужен.

function printNumbersInterval() { 
  var d = 1; 
  setTimeout(function f() { 
    if (d > 20) { 
      return; // выходим из функции, не запуская еще раз setTimeout 
    } 
    console.log(d++); 
    setTimeout(f, 100); 
  }, 100) 
 
}; 
 
console.log(printNumbersInterval());

READ ALSO
Как создать ссылку с атрибутами

Как создать ссылку с атрибутами

при нажатии кнопки необходимо создать ссылку c вводными параметрамиНапример:

93
Поиск цифр в массиве

Поиск цифр в массиве

Есть массив symbolsПосле каждого символа идет цифра

104
NODEJS новый массив по значениям

NODEJS новый массив по значениям

всем привет , второй день не могу мануалы понять как мне суммирвоать массивы по значениям в них

123
innerHTML для элемента body в другом окне

innerHTML для элемента body в другом окне

У меня есть секция на вьюхе c рэндерингом партиал вью:

99