ClearInterval () peut-il être appelé dans 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

J'ai le code ci-dessus et parfois ça marche, parfois ça ne l'est pas. Je me demande si clearInterval efface réellement la minuterie ?? car il y a ce monitorbouton qui ne sera désactivé que lorsqu'il sera en monitoringfonction. J'en ai un autre clearIntervallorsqu'un élément appelé .outputRemoveest cliqué. Voir le code ci-dessous:

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

            });
        });

Mais il a été activé pendant un certain temps avant d'être à nouveau désactivé. Sortira clearIntervalle programme de la setIntervalfonction?

yvonnezoe
la source
Peut-être que le problème est loopnamedans le deuxième extrait? Qu'est-ce que c'est?
bfavaretto
opps faute de frappe. j'avais une fonction clearloop(loopname)qui contient le clearIntervalmais pour le simplifier, je l'ai changé directement dans le code ci-dessus.
yvonnezoe

Réponses:

212

Oui, vous pouvez. Vous pouvez même le tester:

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

Dans cet exemple, ce minuteur s'efface lorsqu'il iatteint 5.

Joseph
la source
4
je vois. doit-il toujours être une variable locale? dans mon cas, je l'ai défini comme global parce que j'ai une fonction externe qui appellera clearInterval ... et aussi, j'ai 2 setInterval pour le moment et ils se heurtent: /
yvonnezoe
J'ai une question ici, est-ce qu'il restera bloqué au point de savoir clearIntervalsi le setIntervals'est arrêté ailleurs / n'a pas commencé du tout?
yvonnezoe
@yvonnezoe a mis à jour la réponse, et c'est non. La fonction qui s'exécute par intervalle se termine avant de ne plus jamais être exécutée. Cependant, dans le cas de votre question, vous avez plusieurs minuteries. Je vous suggère de repenser votre approche.
Joseph
Ok merci pour la clarification! :) alors il doit y avoir des erreurs de logique dans mon programme.
yvonnezoe
1
Le fait que cette approche fonctionne me stupéfie. Nous référençons une variable dans la définition de variable elle-même. Comment cela fonctionne-t-il si nous définissons toujours ce qu'est «timer» et que nous l'appelons ensuite comme argument de clearInterval?