Когда вы звоните setTimeout
, вы получаете идентификатор возвращенного таймера. Это именно то, что вы сделали здесь:
var abc = setTimeout(function run(){
Однако этот идентификатор действителен только до тех пор, пока не будет запущена отложенная функция. Как только это произойдет, это неэффективно. Когда вы звоните setTimeout(run,100);
, вы получите новый идентификатор для таймера. Вам нужно снова это зафиксировать, иначе идентификатор будет утерян, и у вас нет возможности его остановить.
Существует последнее соображение - с вашим текущим кодом, даже если вы должны были правильно захватить идентификатор, вызывающий abc = setTimeout(run, 100);
, который все равно не остановил бы счетчик, потому что он попытается остановить функцию, которая работает прямо сейчас (которая ничего не делает ) вместо отмены выполнения следующего:
let i = 1;
var abc = setTimeout(function run() {
console.log(i);
if (i == 50) {
abc1(); //this will clear the *current* timer
}
i++;
abc = setTimeout(run, 100); //this will set the *new* ID
}, 100);
function abc1() {
clearTimeout(abc);
}
Чтобы остановить выполнение, у вас есть два варианта. Если вы хотите использовать свою первоначальную идею, вам нужно отменить будущее выполнение после того, как запланировано
let i = 1;
var abc = setTimeout(function run() {
console.log(i);
abc = setTimeout(run, 100); //this will set the *new* ID
if (i == 50) {
abc1(); //this will clear the *new* timer now
}
i++;
}, 100);
function abc1() {
clearTimeout(abc);
}
В качестве альтернативы, вы можете сделать это вообще без ручек таймера и просто использовать условие if
, чтобы определить, хотите ли вы запланировать другое выполнение или нет:
let i = 1;
setTimeout(function run() {
console.log(i);
if (i != 50) { //until 50 is reached
abc = setTimeout(run, 100); //schedule a new execution
}
i++;
}, 100);