可以在setInterval()内部调用clearInterval()吗?


124
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。单击clearInterval名为的元素时,我还有另一个.outputRemove。请参见下面的代码:

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

            });
        });

但是启用了一段时间后才再次禁用它。clearIntervalsetInterval功能中取出程序吗?


也许问题出loopname在第二个片段中?那是什么?
bfavaretto

错别字。我有一个clearloop(loopname)包含的函数,clearInterval但是为了简化它,我直接在上面的代码中对其进行了更改。
yvonnezoe

Answers:


212

是的你可以。您甚至可以对其进行测试:

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 时清除。


4
我懂了。必须始终是局部变量吗?在我的情况下,我将其设置为全局,因为我具有将调用clearInterval的外部函数……而且,我当时有2个setInterval且它们发生冲突:/
yvonnezoe 2013年

我有一个问题在这里,它会停留在点clearInterval,如果setInterval已经停止别处/处理不当的开始呢?
yvonnezoe

@yvonnezoe更新了答案,没有。在每个时间间隔运行的功能将在不再运行之前完成。但是,就您的问题而言,您有多个计时器。我建议您重新考虑您的方法。
约瑟夫

好的,谢谢您的澄清!:)然后它一定是我程序中的一些逻辑错误。
yvonnezoe

1
这种方法有效的事实令我感到困惑。我们在变量定义本身中引用变量。如果我们仍在定义“计时器”,然后将其作为clearInterval的参数来调用,该如何工作?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.