javascript - 如何停止setTimeout递归

标签 javascript recursion settimeout

我创建了 setTimeout,它有一个名为 run 的回调,在 run 中我调用了 console.log(i) 来使用 i++ 打印 I 的值一旦达到 50,我想用 clearTimeout 清除 setTimeout,我再次调用 setTimeout 并运行使其递归,但它不起作用。 有人可以帮助我更好地理解这个概念吗?

let i = 1;

var abc = setTimeout(function run(){
   console.log(i);
if(i==50){
    abc1();
  }  
  i++;
  setTimeout(run,100);
},100);
function abc1(){
     clearTimeout(abc);
}

最佳答案

当您调用setTimeout时,您将获得返回的计时器的ID。这正是您在这里所做的:

var abc = setTimeout(function run(){

但是,该 ID 仅在延迟函数执行之前有效。一旦做了,就没有效果了。当您调用 setTimeout(run,100); 时,您将获得计时器的 ID。您需要再次捕获它,否则 ID 会丢失并且您无法阻止它。

还有一个最后的考虑因素 - 即使您要正确捕获调用 abc = setTimeout(run, 100); 的 ID,您当前的代码仍然不会停止计数器,因为它会尝试停止当前正在运行的函数(不执行任何操作),而不是取消下一个函数的执行:

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);
}

为了停止执行,您有两种选择。如果您想使用最初的想法,您需要在计划后取消 future 的执行

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);

关于javascript - 如何停止setTimeout递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56129261/

相关文章:

javascript - Controller 功能中的 Angular 集 $scope.value 不起作用

javascript - jQuery 与 jQuery 移动积木表单提交

javascript - 自定义文件选择器字段标签中的按钮

javascript - event.preventDefault() 导致 :hover pseudo class to stick

java - 递归反向链表,最后一个节点应该指向null吗?

javascript - 如何在 Javascript 中做一个递归计时器

javascript - 为什么Twitter要重新定义window.setTimeout和window.setInterval?

recursion - 在方案中创建尾递归幂函数

perl - 如何使用 Perl 递归复制目录的内容?

javascript - 如何停止同名的嵌套超时?