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?


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.


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?
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.