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

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 функции?


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


Ответы (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.

person Joseph    schedule 17.05.2013
comment
понятно. всегда ли это локальная переменная? в моем случае я установил его как глобальный, потому что у меня есть внешняя функция, которая будет вызывать clearInterval ... а также у меня сейчас есть 2 setInterval, и они конфликтуют: / - person yvonnezoe; 17.05.2013
comment
У меня есть вопрос, застрянет ли он в точке clearInterval, если setInterval остановился где-то еще / не запустился вообще? - person yvonnezoe; 17.05.2013
comment
@yvonnezoe обновил ответ, а это нет. Функция, выполняемая через интервал, завершается до того, как больше никогда не запускается. Однако в случае вашего вопроса у вас есть несколько таймеров. Предлагаю вам переосмыслить свой подход. - person Joseph; 17.05.2013
comment
Хорошо, спасибо за разъяснения! :) значит, в моей программе должны быть какие-то логические ошибки. - person yvonnezoe; 17.05.2013
comment
Hijoseph, Оператор, выполняющий свою часть вашей функции, которая вызывается вашим таймером через определенный интервал. Итак, когда вы очищаете интервал, вызывая clearInterval (timer), абсолютно точно, что таймер уже был очищен, но следующий оператор console.log ('post-interval'); // это все равно будет выполняться после очистки функции (), которая должна быть выполнена. - person irejwanul; 07.12.2016
comment
Тот факт, что этот подход работает, поражает меня. Мы ссылаемся на переменную в самом определении переменной. Как это работает, если мы все еще определяем, что такое «таймер», а затем вызываем его в качестве аргумента для clearInterval? - person ; 25.10.2019
comment
@TeeJ Таймеры, ajax и другие асинхронные операции и т. Д. Начнут иметь смысл, если вы знаете, как цикл обработки событий работает. В этом случае setInterval просто возвращает идентификатор таймера в timer. Когда прошло не менее 200 мсек, вызывается обратный вызов. К тому времени у вас действительно будет timer переменная со значением. - person Joseph; 25.10.2019
comment
Спасибо, @Joseph. В этом есть смысл, и видео очень помогло. Функция внутри setInterval была просто обратным вызовом, который помещается в очередь задач. Значит, к моменту выполнения обратного вызова у него есть ссылка на идентификатор «таймера»? - person ; 25.10.2019
comment
Я бы не назвал переменную timer, а скорее id. JS - сумасшедший язык, потому что в других (скомпилированных) языках, как указывает @user .., вы не можете ссылаться на локальную переменную извне внутри функции. - person Timo; 03.06.2020
comment
Ответ хороший, но этот комментарий //this will still run after clearing неоднозначен, правильный комментарий будет: //This run ONLY ONE TIME and stop - person MTK; 24.08.2020
comment
Можно ли использовать это вместо имени переменной? - person cicciosgamino; 07.07.2021