清除setTimeout里面立即调用的函数

Eas*_*yBB 1 javascript function settimeout

 var a = function(bool){
       (function b(bool){
          if(bool === true || bool === undefined){
          console.log('running');
          setTimeout(b,50);
          }else{
           clearTimeout(b);
          }
       })();
   }
Run Code Online (Sandbox Code Playgroud)

我已经知道这可能比setInterval清除此功能更好.我已经尝试过休息和返回,并且它一直在循环console.log

有关如何轻松取消此功能的任何建议?

我试过的

        if(bool === true || bool === undefined){
          console.log('running');
          setTimeout(b,50);
          }else{
          return;
          }

        var d;
        if(bool === true || bool === undefined){
          console.log('running');
          d=setTimeout(b,50);
          }else{
           clearTimeout(d);
          }
Run Code Online (Sandbox Code Playgroud)

bas*_*kum 5

clearTimeout(MDN)期望"timeoutID"而不是函数作为参数:

var id = setTimeout(b,50);
clearTimeout(id);
Run Code Online (Sandbox Code Playgroud)

但是,当我仔细查看您的代码时,似乎还有另一个问题:

setTimeout(b,50);
Run Code Online (Sandbox Code Playgroud)

你正在调用b没有任何参数,所以函数参数bool将永远是undefined!试试这个:

setTimeout(function () {
    b(false);
},50);
Run Code Online (Sandbox Code Playgroud)

然后它应该只迭代一次.然后你根本不需要清除超时(你只是停止设置新的超时):

var a = function(bool){
       (function b(bool){
          if(bool === true || bool === undefined){
              console.log('running');
              setTimeout(function () {
                  var goOn = false; //<--- abort condition here
                  b(goOn);
              },50);
          }
       })();
   }
Run Code Online (Sandbox Code Playgroud)

现在你只需弄清楚你的中止条件是什么,并把它带到正确的地方.

编辑(回答你的评论)

看来你只需要一个启动间隔的函数和一个停止它的函数.所以接下来是这种设置的最小例子(也计算迭代次数).根据您自己的需要调整它应该相当容易.

var goOn = false,
    counter = 0;

function run() {
    counter++;
    if (goOn) {
        setTimeout(run, 50);
    }
}

function start() {
    counter = 0;
    goOn = true;
    run();
}

function stop() {
    goOn = false;
    console.log(counter);
}
Run Code Online (Sandbox Code Playgroud)