【问题标题】:Can clearInterval() be called inside setInterval()?可以在 setInterval() 中调用 clearInterval() 吗?
【发布时间】:2013-05-12 01:56:26
【问题描述】:
bigloop=setInterval(function () {
              var checked = $('#status_table tr [id^="monitor_"]:checked');
                if (checked.index()===-1 ||checked.length===0 || ){
                    bigloop=clearInterval(bigloop);
                    $('#monitor').button('enable');
                }else{

                        (function loop(i) {                           
                            //monitor element at index i
                            monitoring($(checked[i]).parents('tr'));
                            //delay of 3 seconds
                            setTimeout(function () {
                                //when incremented i is less than the number of rows, call loop for next index
                                if (++i < checked.length) loop(i);
                            }, 3000);
                        }(0)); //start with 0
                }                            
            }, index*3000); //loop period

我有上面的代码,有时它可以工作,有时它不能。我想知道 clearInterval 是否真的清除了计时器?? 因为有这个 monitor 按钮只有在 monitoring 函数中才会被禁用。当单击名为.outputRemove 的元素时,我还有另一个clearInterval。请看下面的代码:

//remove row entry in the table      
        $('#status_table').on('click', '.outputRemove', function () {
            deleted= true;
            bigloop= window.clearInterval(bigloop);
            var thistr=$(this).closest('tr');
            thistr.remove();
            $('#monitor').button('enable');

            $('#status_table tbody tr').find('td:first').text(function(index){
               return ++index;

            });
        });

但它在再次禁用之前启用了一段时间。 clearInterval 会从setInterval 函数中取出程序吗?

【问题讨论】:

  • 也许问题出在第二个sn-p中的loopname?那是什么?
  • opps 错字。我有一个函数clearloop(loopname),其中包含clearInterval,但为了简化它,我直接在上面的代码中进行了更改。

标签: javascript jquery setinterval clearinterval


【解决方案1】:

是的,你可以。你甚至可以测试它:

var i = 0;
var timer = setInterval(function() {
  console.log(++i);
  if (i === 5) clearInterval(timer);
  console.log('post-interval'); //this will still run after clearing
}, 200);

在本例中,当i 达到 5 时,此计时器清零。

【讨论】:

  • 我明白了。它必须始终是局部变量吗?在我的情况下,我将其设置为全局,因为我有外部函数将调用 clearInterval... 而且,我目前有 2 个 setInterval 并且它们正在发生冲突:/
  • 我有一个问题,如果setInterval 在其他地方停止/根本没有开始,它会停留在clearInterval 的位置吗?
  • @yvonnezoe 更新了答案,但事实并非如此。每个间隔运行的函数在它不再运行之前完成。但是,就您的问题而言,您有多个计时器。我建议你重新考虑你的方法。
  • 这种方法行之有效的事实让我大吃一惊。我们在变量定义本身中引用了一个变量。如果我们仍在定义“计时器”是什么,然后将其作为 clearInterval 的参数调用,这将如何工作?
  • 答案很好,但这条评论 //this will still run after clearing 不明确,正确的评论应该是://This run ONLY ONE TIME and stop
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-09
  • 2021-03-01
  • 1970-01-01
相关资源
最近更新 更多