Можно ли вызвать clearInterval () внутри setInterval ()?

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

            });
        });

Но какое-то время он был включен, прежде чем снова отключить. Вытащит clearIntervalпрограмму из setIntervalфункции?

yvonnezoe
источник
Может проблема loopnameво втором сниппете? Что это такое?
bfavaretto
opps опечатка. У меня была функция, clearloop(loopname)которая содержит, clearIntervalно чтобы упростить ее, я изменил ее прямо в приведенном выше коде.
yvonnezoe

Ответы:

213

Да, ты можешь. Вы даже можете это проверить:

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
У меня есть вопрос здесь, будет ли он застрял в точке , clearIntervalесли setIntervalостановилось где - то еще / hasnt начать вообще?
yvonnezoe
@yvonnezoe обновил ответ, а это нет. Функция, выполняемая через интервал, завершается до того, как больше никогда не запускается. Однако в случае вашего вопроса у вас есть несколько таймеров. Предлагаю вам переосмыслить свой подход.
Джозеф
Хорошо, спасибо за разъяснения! :) значит в моей программе должны быть какие-то логические ошибки.
yvonnezoe
1
Тот факт, что этот подход работает, поражает меня. Мы ссылаемся на переменную в самом определении переменной. Как это работает, если мы все еще определяем, что такое «таймер», а затем вызываем его в качестве аргумента для clearInterval?