2009-06-15 43 views
12

vấn đề của tôi là tôi không thể dừng hẹn giờ.stop settimeout trong chức năng đệ quy

Tôi đã có this method để đặt thời gian chờ từ diễn đàn này. Nó phải lưu trữ bộ định danh trong biến toàn cầu. Tình cờ, tôi phát hiện ra rằng nó vẫn đang chạy sau khi tôi ẩn "mydiv".

Tôi cũng cần biết bây giờ, nếu hàm đệ quy tạo nhiều phiên bản hoặc chỉ một lần cho thời gian chờ. Bởi vì đầu tiên tôi nghĩ rằng nó ghi đè lên "var mytimer" mọi lúc. Bây giờ tôi không chắc lắm.

Điều gì sẽ là một cách vững chắc để dừng hẹn giờ?

var updatetimer= function() { 
//do stuff 
     setTimeout(function(){updatetimer();}, 10000); 

}//end function 


//this should start and stop the timer 
$("#mybutton").click(function(e) { 
     e.preventDefault(); 
     if($('#mydiv').is(':visible')){ 
        $('#mydiv').fadeOut('normal'); 
      clearTimeout(updatetimer); 

     }else{ 
        $('#mydiv').fadeIn('normal'); 
        updatetimer(); 
       } 
}); 

cảm ơn, Richard

Trả lời

7

Tôi nghĩ rằng bạn hiểu lầm 'setTimeout' và 'clearTimeout'.

Nếu bạn muốn thiết lập một bộ đếm thời gian mà bạn muốn hủy bỏ sau đó, làm điều gì đó như:

foo = setTimeout(function, time); 

sau đó gọi

clearTimeout(foo); 

nếu bạn muốn hủy hẹn giờ đó.

Hy vọng điều này sẽ hữu ích!

+0

tôi muốn nói đó là khá xấu - đó là chức năng, nhưng không có cách nào để hủy bỏ nó (bởi vì giá trị của setTimeout không bị bắt), nhưng điều đó dễ dàng được sửa và tầm thường so với yêu cầu mỗi giây. Đó là thực sự quá mức, imho. – annakata

+0

cảm ơn, bây giờ tôi không hiểu mã của riêng tôi nữa. Lợi thế của việc sử dụng những hàm ẩn danh đó là gì ??? xem liên kết –

+0

đó là một câu hỏi hoàn toàn khác vì câu trả lời khá rộng: – annakata

2

Khi viết mytimer là một hàm không bao giờ có giá trị của một định danh thời gian chờ, do đó tuyên bố clearTimeout của bạn sẽ không đạt được gì.

Tôi không thấy bất kỳ đệ quy nào ở đây, nhưng bạn cần lưu trữ giá trị setTimeout trả về bạn và nếu bạn cần ghép nối điều này với nhiều sự kiện tiềm năng bạn cần để lưu trữ tra cứu - một cái gì đó giống như một id phần tử có lẽ?

+0

Tôi hiểu những gì bạn đang nói. –

0

Như đã đề cập ở trên, lý do chính khiến mã này không hoạt động là bạn đang passingt ông điều sai vào clearTimeout cuộc gọi - bạn cần phải lưu trữ các giá trị trở lại của setTimeout gọi bạn thực hiện trong updateFunction và vượt qua này vào clearTimeout, thay vì tham chiếu hàm.

Là gợi ý thứ hai để cải thiện - bất cứ khi nào bạn có chức năng gọi lại đệ quy, bạn nên sử dụng phương pháp setInterval, chạy chức năng theo khoảng thời gian đều đặn cho đến khi bị hủy. Điều này sẽ đạt được cùng một điều bạn đang cố gắng làm với phương pháp updateFunction của bạn, nhưng nó sạch hơn vì bạn chỉ cần bao gồm logic "làm công cụ" trong hàm bị trì hoãn và có thể hiệu quả hơn vì bạn sẽ không tạo lồng nhau đóng cửa. Thêm vào đó là cách đúng đắn để làm điều đó mà phải tính cho một thứ gì đó, đúng không? :-)

+0

Từ cuộc thảo luận tại http://stackoverflow.com/questions/729921/settimeout-or-setinterval, setInterval không phải lúc nào cũng tốt hơn. – billyswong

+0

có, từ cuộc thảo luận đó một mình, bạn nhận được khái niệm rằng nó có xu hướng hướng tới việc sử dụng thời gian chờ làm phương pháp được ưu tiên. vì setinterval quees lên chẳng hạn. Tôi không biết về đóng cửa lồng nhau. Có lẽ bạn đúng về điều đó. –

20

Tôi nghĩ rằng hầu hết mọi người đang nhận được lý do tại sao điều này không hoạt động, nhưng tôi nghĩ tôi sẽ cung cấp cho bạn mã cập nhật. Nó khá giống với của bạn, ngoại trừ việc nó gán thời gian chờ cho một biến để nó có thể bị xóa.

Ngoài ra, hàm ẩn danh trong setTimeout là tuyệt vời, nếu bạn muốn chạy nội tuyến logic, thay đổi giá trị của 'this' bên trong hàm hoặc chuyển tham số thành hàm.Nếu bạn chỉ muốn gọi một hàm, nó đủ để truyền tên của hàm như tham số đầu tiên.

var timer = null; 

var updatetimer = function() { 
    //do stuff 

    // By the way, can just pass in the function name instead of an anonymous 
    // function unless if you want to pass parameters or change the value of 'this' 
    timer = setTimeout(updatetimer, 10000); 
}; 

//this should start and stop the timer 
$("#mybutton").click(function(e) { 
    e.preventDefault(); 
    if($('#mydiv').is(':visible')){ 
     $('#mydiv').fadeOut('normal'); 
     clearTimeout(timer); // Since the timeout is assigned to a variable, we can successfully clear it now 

    } else{ 
     $('#mydiv').fadeIn('normal'); 
     updatetimer(); 
    } 
}); 
0

(function() {

$('#my_div').css('background-color', 'red'); 
$('#my_div').hover(function(){ 
var id=setTimeout(function() { 
    $('#my_div').css('background-color', 'green'); 
}, 2000); 

var id=setTimeout(function() { 
    $('#my_div').css('background-color', 'blue'); 
}, 4000); 
var id=setTimeout(function() { 
    $('#my_div').css('background-color', 'pink'); 
}, 6000); 

    }) 

$("#my_div").click(function(){ 
     clearTimeout(id); 

     }) 

})();

+1

Bạn có thể [sửa] và giải thích cách câu trả lời cho câu hỏi này không? – yhw42

0

Bạn không thể ngăn chặn tất cả các chức năng được tạo ra, intead của chuyển đổi chức năng để setInterval (đại diện cho cùng một logic rằng hàm đệ quy của bạn) và ngăn chặn nó:

// recursive 
var timer= function() { 
// do stuff 
    setTimeout(function(){timer();}, 10000); 
} 

Logic tương tự sử dụng setInterval:

// same logic executing stuff in 10 seconds loop 
var timer = setInterval(function(){// do stuff}, 10000) 

Dừng nó:

clearInterval(timer); 
Các vấn đề liên quan