2012-03-28 71 views
29

Khi làm việc trên một số Javascript cho một ứng dụng web, tôi nhận thấy rằng tôi đã sử dụng setTimeout, nhưng tôi đã cố gắng để xóa nó với clearInterval và nó dừng lại thời gian chờ từ xảy ra trong Google Chrome và Internet Explorer 9.ClearTimeout và clearInterval có giống nhau không?

Are clearTimeoutclearInterval có thể hoán đổi cho nhau?

Here's a JSfiddle với ví dụ về những gì tôi đang nói đến.

+4

Mặc dù điều này có thể đúng trong hầu hết các triển khai, bạn không nên dựa vào nó vì nó không được xác định theo cách này. –

+0

Nó có thể hoạt động trong một số trình duyệt, nhưng nó có thể không hoạt động giống nhau trong tất cả các trình duyệt, vì vậy tôi sẽ không thực sự làm điều đó. –

+0

Câu hỏi hay (và câu trả lời) cảm ơn vì đã hỏi! – Myster

Trả lời

19

Không, chúng không thể hoán đổi cho nhau. Chắc chắn, một số trình duyệt có thể chia sẻ cùng một mã để xóa khoảng thời gian và thời gian chờ theo cùng một cách, nhưng không có nghĩa là chúng là hoán đổi cho nhau và bạn chắc chắn không đảm bảo rằng chúng hoạt động giống nhau trên tất cả các triển khai trình duyệt . Nó đi xuống đến hai phương pháp được định nghĩa khác nhau cho các mục đích khác nhau và do đó bạn nên sử dụng chúng cho mục đích sử dụng của họ .. Nếu không, bạn chỉ yêu cầu cho sự cố.

0

Ngay cả khi chúng có thể được sử dụng đồng nghĩa bây giờ nó có thể thay đổi bất cứ lúc nào trong tương lai. Tại sao bạn không nên gọi một spade một spade? :-)

+1

Vâng, đó là một thực hành tiêu chuẩn tốt không sử dụng chức năng chưa được xuất bản, nhưng điều đó không trả lời câu hỏi ngay bây giờ. – Daisetsu

19

Thực ra tôi tin rằng chúng ta có thể đưa ra một kết luận khá mạnh mẽ từ thông số W3C (http://www.w3.org/TR/html5/webappapis.html#timers). Nó không được đảm bảo một cách rõ ràng nhưng chúng tôi có rất nhiều bằng chứng cho thấy hầu như bất kỳ thực hiện hợp lý sẽ có hành vi này:

1) Timeouts và Khoảng thực sự sử dụng cùng một chức năng cơ bản:

() Phương pháp này setTimeout phải trả về giá trị được trả về bởi các bước khởi tạo hẹn giờ, chuyển cho chúng các đối số của phương thức ... và cờ lặp lại được đặt thành false.

Phương thức setInterval() phải trả về giá trị được trả về bởi bộ đếm thời gian bước khởi tạo, chuyển cho chúng đối số của phương thức .... và cờ lặp được đặt thành true.

2) Chức năng này duy nhất - là "bước khởi tạo timer" được đề cập ở trên - sử dụng một danh sách duy nhất của tính giờ:

2, ... hãy xử lý là một số nguyên user-agent xác định rằng lớn hơnsẽ xác định thời gian chờ được đặt bởi cuộc gọi này trong danh sách bộ hẹn giờ hoạt động.

10, Return xử lý ...

3) clearTimeout() và clearInterval() cả hai hoạt động trên danh sách đó (và trên thực tế không được phân biệt bằng spec dưới mọi hình thức)

Các phương thức clearTimeout() và clearInterval() phải xóa mục nhập được xác định là xử lý từ danh sách các bộ đếm thời gian hoạt động của đối tượng Window2 đối tượng mà phương thức được gọi, trong đó xử lý là đối số được truyền cho phương thức, nếu có. (Nếu xử lý không xác định mục nhập trong danh sách các bộ đếm thời gian hoạt động của đối tượng WindowTimers mà phương thức đã được gọi, phương thức sẽ không làm gì.)

Tôi tin rằng điều này thể hiện một trường hợp khá rõ ràng là clearTimeout và clearInterval nên được đồng nghĩa theo thông số. Điều này được sao lưu bởi thực tế là nó hoạt động trong tất cả các trình duyệt mà tôi đã thử nghiệm (Chrome 37, Firefox 33 và Opera 25).

+6

Tôi không biết nếu nó chỉ là mã không đúng, nhưng ví dụ thứ hai trong giới thiệu hiển thị trang api sử dụng 'setInterval' và' clearTimeout' với nhau: http://www.w3.org/TR/page-visibility/# Giới thiệu – TheZ

8

Từ Mozilla reference:

Nó đáng chú ý là hồ bơi của các ID được sử dụng bởi setTimeout() và setInterval() được chia sẻ, có nghĩa là bạn về mặt kỹ thuật có thể sử dụng clearTimeout() và clearInterval() thay thế cho nhau . Tuy nhiên, đối với rõ ràng, bạn nên tránh làm như vậy.

Các vấn đề liên quan