clearInterval () สามารถเรียกภายใน setInterval () ได้หรือไม่


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

ฉันมีรหัสด้านบนและบางครั้งก็ใช้งานได้บางครั้งก็ไม่ได้ ฉันสงสัยว่าclearInterval ล้างตัวจับเวลาจริงหรือ ?? เนื่องจากมีmonitorปุ่มนี้ที่จะปิดใช้งานเมื่ออยู่ในmonitoringฟังก์ชันเท่านั้น ฉันมีอีกอย่างหนึ่งclearIntervalเมื่อมีการ.outputRemoveคลิกองค์ประกอบที่เรียกว่า ดูรหัสด้านล่าง:

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

            });
        });

แต่มันถูกเปิดใช้งานชั่วขณะก่อนที่จะปิดการใช้งานอีกครั้ง จะclearIntervalได้โปรแกรมออกจากsetIntervalฟังก์ชัน?


บางทีปัญหาอยู่loopnameในตัวอย่างที่สอง นั่นคืออะไร?
bfavaretto

opps พิมพ์ผิด ฉันมีฟังก์ชั่นclearloop(loopname)ที่มีclearIntervalแต่เพื่อให้ง่ายขึ้นฉันเปลี่ยนมันโดยตรงในโค้ดด้านบน
yvonnezoe

คำตอบ:


213

ใช่คุณสามารถ. คุณสามารถทดสอบได้:

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

ในตัวอย่างนี้ตัวจับเวลานี้จะล้างเมื่อiถึง 5


4
ฉันเห็น. ต้องเป็นตัวแปรท้องถิ่นเสมอไปหรือไม่? ในกรณีของฉันฉันตั้งเป็น global เพราะฉันมีฟังก์ชันภายนอกที่จะเรียก clearInterval ... และฉันมี 2 setInterval ในขณะนั้นและพวกเขากำลังปะทะกัน: /
yvonnezoe

ฉันมีคำถามที่นี่มันจะติดอยู่ที่จุดclearIntervalที่setIntervalหยุดที่อื่นหรือไม่ / ยังไม่เริ่มเลย?
yvonnezoe

@yvonnezoe อัปเดตคำตอบและนั่นไม่ใช่ ฟังก์ชันที่ทำงานต่อช่วงเวลาจะเสร็จสิ้นก่อนที่จะไม่ทำงานอีก อย่างไรก็ตามในกรณีของคำถามของคุณคุณมีตัวจับเวลาหลายตัว ฉันขอแนะนำให้คุณทบทวนแนวทางของคุณใหม่
โจเซฟ

โอเคขอบคุณสำหรับการชี้แจง! :) แล้วมันต้องมีข้อผิดพลาดทางตรรกะในโปรแกรมของฉัน
yvonnezoe

1
ความจริงที่ว่าวิธีนี้ได้ผลทำให้ฉันคิดไม่ถึง เรากำลังอ้างอิงตัวแปรในนิยามตัวแปรเอง วิธีนี้จะทำงานอย่างไรถ้าเรายังคงกำหนดว่า 'ตัวจับเวลา' คืออะไรแล้วเรียกมันว่าอาร์กิวเมนต์ clearInterval?
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.