Czy można wywołać metodę clearInterval () wewnątrz metody 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

Mam powyższy kod i czasami działa, czasami nie. Zastanawiam się, czy clearInterval faktycznie czyści licznik czasu ?? ponieważ istnieje ten monitorprzycisk, który będzie nieaktywny tylko wtedy, gdy jest monitoringaktywny. Mam inny, clearIntervalgdy .outputRemovekliknięto wywoływany element . Zobacz poniższy kod:

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

            });
        });

Ale był włączony przez chwilę, zanim został ponownie wyłączony. Czy clearIntervalprogram wyjdzie z setIntervalfunkcji?

yvonnezoe
źródło
Może problem tkwi loopnamew drugim fragmencie? Co to jest?
bfavaretto
opps literówka. Miałem funkcję, clearloop(loopname)która zawiera, clearIntervalale aby ją uprościć, zmieniłem ją bezpośrednio w powyższym kodzie.
yvonnezoe

Odpowiedzi:

213

Tak, możesz. Możesz to nawet przetestować:

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

W tym przykładzie ten licznik jest zerowany, gdy iosiągnie 5.

Józef
źródło
4
Widzę. czy zawsze musi to być zmienna lokalna? w moim przypadku ustawiłem go jako globalny, ponieważ mam zewnętrzną funkcję, która wywoła clearInterval ... a także mam w tej chwili 2 setInterval i ścierają się: /
yvonnezoe
mam tutaj pytanie, czy utknie w miejscu clearInterval, w setIntervalktórym zatrzymał się gdzieś indziej / w ogóle się nie rozpoczął?
yvonnezoe
@yvonnezoe zaktualizował odpowiedź i to nie. Funkcja uruchamiana w interwale kończy się, zanim nie zostanie ponownie uruchomiona. Jednak w przypadku twojego pytania masz wiele timerów. Proponuję przemyśleć swoje podejście.
Józef
Dobrze, dziękuję za wyjaśnienie! :) to musi być jakiś błąd logiczny w moim programie.
yvonnezoe
1
Fakt, że to podejście działa, wprawia mnie w zakłopotanie. Odwołujemy się do zmiennej w samej definicji zmiennej. Jak to działa, jeśli nadal definiujemy, czym jest „timer”, a następnie wywołujemy go jako argument do clearInterval?