È 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.