2011-12-29 46 views
17

Tôi muốn tạo bộ hẹn giờ khi nó đạt đến một điểm nhất định, bộ hẹn giờ sẽ đặt lại và sau đó bắt đầu lại.vòng hẹn giờ javascript

Hiện tại, tôi đã thiết lập vòng lặp và thử nghiệm tôi muốn đặt lại sau 5000 mili giây (5 giây). Nhưng truy cập đi tất cả haywire.

WIP Demo đây: http://jsfiddle.net/stursby/wUHA3/

+1

Trước khi tôi nhấp vào demo, nó sẽ sụp đổ trình duyệt? ': P' –

+0

Bộ đếm được đặt lại trong Firefox ... –

+0

haha ​​không, đây không phải là vòng lặp vô hạn. Tôi đang cập nhật văn bản của một khoảng với giá trị bộ đếm thời gian hiện tại ... vì vậy đó là điều duy nhất bị rối tung lên, bạn sẽ thấy. – stursby

Trả lời

43

Thay vì setTimeout, xem xét sử dụng setInterval. Nó sẽ tự động lặp lại cho đến khi bạn xóa khoảng thời gian.

setInterval(myMethod, 5000); 

function myMethod() 
{ 
    //this will repeat every 5 seconds 
    //you can reset counter here 
} 
+1

Tôi đồng ý, chỉ để chỉ ra lý do anh ta gặp vấn đề được mô tả là vì dòng 'var diff = (new Date(). getTime() - bắt đầu) - thời gian, 'không cần thiết cho dòng đó. Anh ta nên làm 'window.setTimeout (instance, 100),' thay vì 'window.setTimeout (instance, (100 - diff));'. Và vấn đề của anh ta đã được giải quyết. – Chad

+0

Bạn có thể đăng bài đó như một câu trả lời vì nó chỉ là hợp lệ. OP sau đó có thể quyết định xem phương pháp đó có phù hợp với chương trình tổng thể của họ hay không. Mặc dù setInterval thường có ý nghĩa trong trường hợp như thế này, mã của bạn trực tiếp khắc phục sự cố trong tầm tay. – keyboardP

+0

Ý tưởng hay, được đăng. – Chad

5

Tôi đồng ý với keyboardP mà bạn có lẽ nên được sử dụng thay vì setIntervalsetTimeout. Tuy nhiên, để trả lời câu hỏi ban đầu của bạn lý do bạn gặp vấn đề với bộ đếm thời gian là do logic lặp lại của bạn. Không sử dụng:

var diff = (new Date().getTime() - start) - time; 
window.setTimeout(instance, (100 - diff)); 

Bạn không cần phải cố gắng và chiếm thời gian thực hiện (mà tôi giả định là những gì bạn đang cố gắng để làm với diff). Chỉ cho rằng đó là không đáng kể và sử dụng:

setTimeout(instance, 100); 

Và vấn đề của bạn được giải quyết, như bạn có thể nhìn thấy trong this jsFiddle.

+0

+1 (không ngạc nhiên: D) để sửa mã gốc của OP. – keyboardP

+0

có cách nào dễ dàng để tăng thêm 1 thay vì 100? Ví dụ, 2,1 giây là 2100, có cách nào để nhận được nhiều số thập phân hơn như 2,154 giây hoặc 2154 trên bộ hẹn giờ không? – stursby

+0

cũng độ chính xác sẽ không chính xác đến mili giây. Trình duyệt đánh giá thời gian chờ/khoảng thời gian khác nhau. Như một trung bình mỗi 13ms một thời gian chờ được đánh giá. SO đó là về cụ thể như bạn có thể nhận được, tùy thuộc vào trình duyệt. – Chad