È possibile chiamare clearInterval () all'interno di 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

Ho il codice sopra e a volte funziona, a volte no. Mi chiedo se il clearInterval cancella effettivamente il timer ?? perché c'è questo monitorpulsante che sarà disabilitato solo quando è in monitoringfunzione. Ne ho un altro clearIntervalquando si .outputRemovefa clic su un elemento chiamato . Vedi il codice qui sotto:

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

            });
        });

Ma è stato abilitato per un po 'prima di essere nuovamente disabilitato. Uscirà clearIntervalil programma dalla setIntervalfunzione?


Forse il problema è loopnamenel secondo frammento? Cos'è quello?
bfavaretto

errore di battitura opps. avevo una funzione clearloop(loopname)che contiene il clearIntervalma per semplificarlo, l'ho modificata direttamente nel codice sopra.
yvonnezoe

Risposte:


212

Si, puoi. Puoi anche provarlo:

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

In questo esempio, questo timer si azzera quando iraggiunge 5.


4
Vedo. deve essere sempre una variabile locale? nel mio caso, l'ho impostato come globale perché ho una funzione esterna che chiamerà clearInterval ... e inoltre, ho 2 setInterval al momento e si stanno scontrando: /
yvonnezoe

Ho una domanda qui, si è attaccato al punto di clearIntervalse l' setIntervalha fermato da qualche altra parte / hasnt iniziare a tutti?
yvonnezoe

@yvonnezoe ha aggiornato la risposta, e questo è no. La funzione che viene eseguita per intervallo termina prima di non essere più eseguita. Tuttavia, nel caso della tua domanda, hai più timer. Ti suggerisco di ripensare al tuo approccio.
Joseph

Va bene grazie per aver chiarito! :) allora devono esserci degli errori logici nel mio programma.
yvonnezoe

1
Il fatto che questo approccio funzioni mi sbalordisce. Stiamo facendo riferimento a una variabile nella definizione della variabile stessa. Come funziona se stiamo ancora definendo cos'è "timer" e poi lo chiamiamo come argomento per clearInterval?
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.