Kann clearInterval () in setInterval () aufgerufen werden?

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

Ich habe den obigen Code und manchmal funktioniert er, manchmal nicht. Ich frage mich, ob das clearInterval tatsächlich den Timer löscht? weil es diese monitorSchaltfläche gibt, die nur deaktiviert wird, wenn sie in monitoringFunktion ist. Ich habe eine andere, clearIntervalwenn ein Element namens aufgerufen .outputRemovewird. Siehe den folgenden Code:

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

            });
        });

Es wurde jedoch eine Weile aktiviert, bevor es wieder deaktiviert wurde. Wird clearIntervaldas Programm aus der setIntervalFunktion herauskommen ?

Yvonnezoe
quelle
Vielleicht liegt das Problem loopnameim zweiten Ausschnitt? Was ist das?
Bfavaretto
opps Tippfehler. Ich hatte eine Funktion, die clearloop(loopname)das enthält, clearIntervalaber um es zu vereinfachen, habe ich es direkt im obigen Code geändert.
Yvonnezoe

Antworten:

212

Ja, du kannst. Sie können es sogar testen:

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 diesem Beispiel wird dieser Timer gelöscht, wenn i5 erreicht ist.

Joseph
quelle
4
Aha. Muss es immer eine lokale Variable sein? In meinem Fall habe ich es als global festgelegt, weil ich eine äußere Funktion habe, die clearInterval aufruft ... und außerdem habe ich derzeit 2 setInterval und sie
stoßen
Ich habe hier eine Frage, wird es an dem Punkt hängen bleiben, an dem clearIntervaldas setIntervalwoanders angehalten hat / überhaupt nicht gestartet hat?
Yvonnezoe
@yvonnezoe hat die Antwort aktualisiert, und das ist nein. Die Funktion, die pro Intervall ausgeführt wird, wird beendet, bevor sie nie wieder ausgeführt wird. Bei Ihrer Frage haben Sie jedoch mehrere Timer. Ich schlage vor, Sie überdenken Ihren Ansatz.
Joseph
Okay, danke für die Klarstellung! :) dann müssen es einige logische fehler in meinem programm sein.
Yvonnezoe
1
Die Tatsache, dass dieser Ansatz funktioniert, verwirrt mich. Wir verweisen auf eine Variable in der Variablendefinition selbst. Wie funktioniert das, wenn wir immer noch definieren, was "Timer" ist, und es dann als Argument für clearInterval aufrufen?