ClearInterval () pode ser chamado dentro de 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

Eu tenho o código acima e às vezes está funcionando, às vezes não. Gostaria de saber se o clearInterval realmente limpar o temporizador? porque existe esse monitorbotão que só será desativado quando estiver em monitoringfuncionamento. Eu tenho outro clearIntervalquando um elemento chamado .outputRemoveé clicado. Veja o código abaixo:

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

            });
        });

Mas foi ativado por um tempo antes de ser desativado novamente. O clearIntervalprograma sairá da setIntervalfunção?

yvonnezoe
fonte
Talvez o problema esteja loopnameno segundo trecho? O que é isso?
Bfavaretto 17/05
opps typo. Eu tinha uma função clearloop(loopname)que contém o clearIntervalmas para simplificá-lo, eu mudei diretamente no código acima.
Yvonnezoe 17/05

Respostas:

212

Sim você pode. Você pode até testá-lo:

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

Neste exemplo, esse timer limpa quando iatinge 5.

Joseph
fonte
4
Entendo. deve sempre ser uma variável local? no meu caso, eu defini-lo como global porque tenho uma função externa que chamará clearInterval ... e também tenho 2 setInterval no momento e estão em conflito: /
yvonnezoe
Eu tenho uma pergunta aqui, será que ficou preso no ponto de clearIntervalse o setIntervalparou em outro lugar / não foi iniciado?
Yvonnezoe 17/05
@yvonnezoe atualizou a resposta, e não é. A função executada por intervalo termina antes que nunca seja executada novamente. No entanto, no caso da sua pergunta, você tem vários temporizadores. Eu sugiro que você repense sua abordagem.
Joseph
Ok, obrigado por esclarecer! :) então deve haver alguns erros de lógica no meu programa.
Yvonnezoe 17/05
1
O fato de essa abordagem funcionar incomoda minha mente. Estamos fazendo referência a uma variável na própria definição de variável. Como isso funciona se ainda estamos definindo o que é 'timer' e depois chamando-o de argumento para clearInterval?