Bisakah clearInterval () dipanggil di dalam 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

Saya memiliki kode di atas dan terkadang berfungsi, terkadang tidak. Saya bertanya-tanya apakah clearInterval benar-benar menghapus pengatur waktu ?? karena ada monitortombol ini yang hanya akan dinonaktifkan ketika sedang monitoringberfungsi. Saya memiliki yang lain clearIntervalketika elemen yang disebut .outputRemovediklik. Lihat kode di bawah ini:

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

            });
        });

Tapi itu diaktifkan beberapa saat sebelum dinonaktifkan lagi. Akan clearIntervalmengeluarkan program dari setIntervalfungsinya?

yvonnezoe
sumber
Mungkin masalahnya ada loopnamedi cuplikan kedua? Apa itu?
bfavaretto
opps salah ketik. saya punya fungsi clearloop(loopname)yang berisi clearIntervaltetapi untuk menyederhanakannya, saya mengubahnya langsung dalam kode di atas.
yvonnezoe

Jawaban:

212

Ya kamu bisa. Anda bahkan dapat mengujinya:

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

Dalam contoh ini, timer ini hilang saat imencapai 5.

Joseph
sumber
4
saya melihat. haruskah itu selalu menjadi variabel lokal? dalam kasus saya, saya menetapkannya sebagai global karena saya memiliki fungsi luar yang akan memanggil clearInterval ... dan juga, saya memiliki 2 setInterval saat ini dan mereka bentrok: /
yvonnezoe
saya punya pertanyaan di sini, apakah itu akan macet pada titik clearIntervaljika setIntervaltelah berhenti di tempat lain / belum mulai sama sekali?
yvonnezoe
@yvonnezoe memperbarui jawabannya, dan itu tidak. Fungsi yang berjalan per interval selesai sebelum tidak pernah dijalankan lagi. Namun, untuk pertanyaan Anda, Anda punya banyak timer. Saya sarankan Anda memikirkan kembali pendekatan Anda.
Joseph
Oke terima kasih telah menjelaskan! :) maka pasti ada beberapa kesalahan logika dalam program saya.
yvonnezoe
1
Fakta bahwa pendekatan ini berhasil mengejutkan saya. Kami mereferensikan variabel dalam definisi variabel itu sendiri. Bagaimana cara kerjanya jika kita masih mendefinisikan apa itu 'timer' dan kemudian menyebutnya sebagai argumen untuk menghapus Interval?