¿Se puede invocar clearInterval () 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

Tengo el código anterior y a veces funciona, a veces no. Me pregunto si clearInterval realmente borra el temporizador. porque existe este monitorbotón que solo se desactivará cuando esté en monitoringfuncionamiento. Tengo otro clearIntervalcuando .outputRemovese hace clic en un elemento llamado . Vea el código a continuación:

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

            });
        });

Pero se habilitó por un tiempo antes de que se deshabilite nuevamente. ¿ clearIntervalSaldrá el programa de la setIntervalfunción?

yvonnezoe
fuente
¿Quizás el problema está loopnameen el segundo fragmento? ¿Que es eso?
bfavaretto
opps typo. Tenía una función clearloop(loopname)que contiene el clearIntervalpero para simplificarlo, lo cambié directamente en el código anterior.
yvonnezoe

Respuestas:

212

Sí tu puedes. Incluso puedes probarlo:

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

En este ejemplo, este temporizador se borra cuando ialcanza 5.

Joseph
fuente
44
Veo. debe ser siempre una variable local? en mi caso, lo configuré como global porque tengo una función externa que llamará a clearInterval ... y también, tengo 2 setInterval en este momento y están en conflicto: /
yvonnezoe
Tengo una pregunta aquí, ¿se bloqueará en el punto de clearIntervalsi se setIntervalha detenido en otro lugar / no ha comenzado en absoluto?
yvonnezoe
@yvonnezoe actualizó la respuesta, y eso no. La función que se ejecuta por intervalo finaliza antes de que nunca se vuelva a ejecutar. Sin embargo, en el caso de su pregunta, tiene varios temporizadores. Le sugiero que reconsidere su enfoque.
Joseph
Ok, gracias por aclarar! :) entonces debe haber algunos errores lógicos en mi programa.
yvonnezoe
1
El hecho de que este enfoque funcione me aturde. Estamos haciendo referencia a una variable en la definición de la variable misma. ¿Cómo funciona esto si todavía estamos definiendo qué es el 'temporizador' y luego lo llamamos como argumento para clearInterval?