ClearInterval () setInterval () içinde çağrılabilir mi?


125
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

Yukarıdaki kod bende var ve bazen çalışıyor, bazen çalışmıyor. ClearInterval'in gerçekten zamanlayıcıyı temizleyip temizlemediğini merak ediyorum. çünkü monitoryalnızca monitoringişlev halindeyken devre dışı bırakılacak olan bu düğme var . clearIntervalÇağrılan bir öğe .outputRemovetıklandığında başka bir tane var . Aşağıdaki koda bakı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;

            });
        });

Ancak tekrar devre dışı bırakılmadan önce bir süre etkinleştirildi. Will clearIntervalprogramı çıkmak setIntervalfonksiyonu?


Belki sorun loopnameikinci kod parçasındadır? O nedir?
bfavaretto

opps yazım hatası. ama clearloop(loopname)içeren bir işleve clearIntervalsahiptim, onu basitleştirmek için doğrudan yukarıdaki kodda değiştirdim.
yvonnezoe

Yanıtlar:


213

Evet yapabilirsin. Hatta test edebilirsiniz:

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

Bu örnekte, bu zamanlayıcı i5'e ulaştığında silinir .


4
anlıyorum. her zaman yerel bir değişken olmalı mı? benim durumumda, bunu global olarak ayarladım çünkü clearInterval'ı çağıracak bir dış fonksiyonum var ... ve ayrıca, şu anda 2 setInterval'im var ve çatışıyorlar: /
yvonnezoe,

ben noktasında takılıp olacak, burada bir sorum var clearIntervaleğer setInterval/ has not tüm başlayacak başka bir yerde durdu?
yvonnezoe

@yvonnezoe cevabı güncelledi ve bu hayır. Aralık başına çalışan işlev, bir daha asla çalıştırılmadan önce biter. Bununla birlikte, sorunuz durumunda, birden fazla zamanlayıcınız var. Yaklaşımınızı yeniden düşünmenizi öneririm.
Joseph

Tamam, açıkladığınız için teşekkürler! :) o zaman programımda bazı mantık hataları olmalı.
yvonnezoe

1
Bu yaklaşımın işe yaraması aklımı karıştırıyor. Değişken tanımının kendisinde bir değişkeni referans alıyoruz. Hala 'zamanlayıcının' ne olduğunu tanımlıyorsak ve sonra onu clearInterval için bir argüman olarak adlandırıyorsak, bu nasıl çalışır?
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.