ClearInterval () có thể được gọi bên trong setInterval () không?


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

Tôi có mã ở trên và đôi khi nó hoạt động, đôi khi nó không. Tôi đang tự hỏi nếu clearInterval thực sự xóa bộ đếm thời gian ?? bởi vì có monitornút này sẽ chỉ bị vô hiệu hóa khi nó đang monitoringhoạt động. Tôi có một cái khác clearIntervalkhi một phần tử được gọi .outputRemoveđược nhấp vào. Xem mã bên dưới:

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

            });
        });

Nhưng nó đã được kích hoạt trong một thời gian trước khi nó bị vô hiệu hóa trở lại. Sẽ clearIntervallấy chương trình ra khỏi setIntervalchức năng?


Có thể vấn đề là loopnameở đoạn mã thứ hai? Đó là gì?
bfavaretto

lỗi đánh máy của opps. tôi đã có một hàm clearloop(loopname)có chứa clearIntervalnhưng để đơn giản hóa nó, tôi đã thay đổi nó trực tiếp trong đoạn mã trên.
yvonnezoe

Câu trả lời:


212

Có bạn có thể. Bạn thậm chí có thể kiểm tra nó:

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

Trong ví dụ này, bộ đếm thời gian này sẽ xóa khi iđạt đến 5.


4
tôi hiểu rồi. nó phải luôn luôn là một biến cục bộ? trong trường hợp của tôi, tôi đặt nó như là toàn cầu, vì tôi có chức năng bên ngoài mà sẽ gọi clearInterval ... và cũng có thể, tôi có 2 setInterval tại thời điểm hiện tại và họ đang đụng độ: /
yvonnezoe

tôi có một câu hỏi ở đây, nó sẽ bị mắc kẹt ở điểm clearIntervalnếu nó setIntervalđã dừng lại ở một nơi khác / vẫn chưa bắt đầu?
yvonnezoe

@yvonnezoe đã cập nhật câu trả lời và đó là không. Hàm chạy mỗi khoảng thời gian kết thúc trước khi nó không bao giờ chạy lại. Tuy nhiên, trong trường hợp câu hỏi của bạn, bạn có nhiều bộ hẹn giờ. Tôi khuyên bạn nên suy nghĩ lại cách tiếp cận của mình.
Joseph

Được rồi, cảm ơn bạn đã làm rõ! :) thì nó phải là một số lỗi logic trong chương trình của tôi.
yvonnezoe

1
Thực tế là cách tiếp cận này hoạt động làm suy nghĩ của tôi. Chúng tôi đang tham chiếu đến một biến trong chính định nghĩa biến. Điều này hoạt động như thế nào nếu chúng ta vẫn đang xác định 'bộ đếm thời gian' là gì và sau đó gọi nó như một đối số cho clearInterval?
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.