【问题标题】:clear setTimeout inside immediately invoked functions在立即调用的函数中清除 setTimeout
【发布时间】:2014-01-17 09:20:27
【问题描述】:
 var a = function(bool){
       (function b(bool){
          if(bool === true || bool === undefined){
          console.log('running');
          setTimeout(b,50);
          }else{
           clearTimeout(b);
          }
       })();
   }

我了解到这应该比setInterval 更好,尽管清除此功能不起作用。我已经尝试过 break 和 return 并且它一直循环通过 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);
          }

【问题讨论】:

    标签: javascript function settimeout


    【解决方案1】:

    clearTimeout (MDN) 需要“timeoutID”而不是函数作为参数:

    var id = setTimeout(b,50);
    clearTimeout(id);
    

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

    setTimeout(b,50);
    

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

    setTimeout(function () {
        b(false);
    },50);
    

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

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

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

    编辑(回答您的评论)

    您似乎只需要一个启动间隔的函数和一个停止间隔的函数。下面是这种设置的一个最小示例(也包括迭代计数)。根据您自己的需要调整它应该相当容易。

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

    【讨论】:

    • yes yes yes ;) 我也试过了。抱歉,该帖子是我尝试的最后一次试用
    • 好的,我知道你在那里做了什么,但问题是我不想要一次迭代
    • 当然可以,但是您没有提供任何关于您希望此间隔何时结束的信息。
    • 我正在设置一个代码,以便 _$.steps('sec') 它在几秒钟内完成步骤,然后如果他们写 _$.steps('break') 或其他东西,它应该停止并给他们返回的步骤。
    猜你喜欢
    • 1970-01-01
    • 2020-01-02
    • 2020-08-22
    • 1970-01-01
    • 1970-01-01
    • 2015-02-22
    • 2021-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多