Чи можна викликати clearInterval () всередині setInterval ()?


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;

            });
        });

Але це було включено на деякий час, перш ніж його знову відключити. Чи clearIntervalвийде програма з setIntervalфункції?


Може проблема loopnameв другому фрагменті? Що це?
бфаваретто

Опечатка друку. У мене була функція, clearloop(loopname)яка містить, clearIntervalале щоб спростити її, я змінив її безпосередньо в коді вище.
івоннезое

Відповіді:


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

У мене тут питання, чи буде він застряг на місці, clearIntervalякщо setIntervalзупинився десь ще / не почався взагалі?
івоннезое

@yvonnezoe оновив відповідь, і це ні. Функція, яка працює за інтервал, закінчується, перш ніж вона більше ніколи не запускається. Однак у випадку вашого запитання у вас є кілька таймерів. Я пропоную вам переосмислити свій підхід.
Йосип

Гаразд дякую за уточнення! :) тоді це повинні бути деякі логічні помилки в моїй програмі.
yvonnezoe

1
Той факт, що такий підхід працює, вражає мій розум. Ми посилаємося на змінну в самому визначенні змінної. Як це працює, якщо ми все ще визначаємо, що таке «таймер», а потім називаємо це аргументом для очищення інтернету?
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.