Có sự khác biệt nào không?
Đúng. Thời gian chờ thực thi một khoảng thời gian nhất định sau khi setTimeout () được gọi; một Interval thực thi một khoảng thời gian nhất định sau khi khoảng thời gian trước đó được kích hoạt.
Bạn sẽ nhận thấy sự khác biệt nếu hàm doStuff () của bạn mất một lúc để thực thi. Ví dụ: nếu chúng tôi biểu thị một lệnh gọi đến setTimeout / setInterval với .
, việc kích hoạt thời gian chờ / khoảng thời gian *
và thực thi mã JavaScript với [-----]
, các mốc thời gian sẽ như sau:
Timeout:
. * . * . * . * .
[--] [--] [--] [--]
Interval:
. * * * * * *
[--] [--] [--] [--] [--] [--]
Sự phức tạp tiếp theo là nếu một khoảng thời gian kích hoạt trong khi JavaScript đã bận làm việc gì đó (chẳng hạn như xử lý một khoảng trước đó). Trong trường hợp này, khoảng thời gian được ghi nhớ và xảy ra ngay khi trình xử lý trước kết thúc và trả lại quyền điều khiển cho trình duyệt. Vì vậy, ví dụ cho quy trình doStuff () đôi khi ngắn ([-]) và đôi khi dài ([-----]):
. * * • * • * *
[-] [-----][-][-----][-][-] [-]
• đại diện cho một khoảng thời gian bắn không thể thực thi mã của nó ngay lập tức và được thực hiện chờ xử lý thay thế.
Vì vậy, các khoảng thời gian cố gắng 'bắt kịp' để lấy lại lịch trình. Nhưng, họ không xếp hàng chồng lên nhau: chỉ có thể có một thực thi đang chờ xử lý cho mỗi khoảng. (Nếu tất cả họ xếp hàng, trình duyệt sẽ được để lại một danh sách thực thi ngày càng mở rộng!)
. * • • x • • x
[------][------][------][------]
x đại diện cho một khoảng thời gian bắn không thể thực hiện hoặc đang chờ xử lý, vì vậy thay vào đó đã bị loại bỏ.
Nếu chức năng doStuff () của bạn thường mất nhiều thời gian để thực thi hơn khoảng thời gian được đặt cho nó, trình duyệt sẽ ăn 100% CPU để phục vụ nó và có thể trở nên kém phản hồi hơn.
Bạn sử dụng cái nào và tại sao?
Chained-Timeout cung cấp một khoảng thời gian rảnh được đảm bảo cho trình duyệt; Interval cố gắng đảm bảo chức năng mà nó đang chạy thực thi càng gần với thời gian đã lên lịch của nó, với chi phí sẵn có cho trình duyệt UI.
Tôi sẽ xem xét một khoảng thời gian cho các hình ảnh động một lần mà tôi muốn trở nên mượt mà nhất có thể, trong khi thời gian bị xiềng xích sẽ lịch sự hơn cho các hình ảnh động đang diễn ra trong suốt thời gian trang được tải. Đối với việc sử dụng ít đòi hỏi hơn (chẳng hạn như một trình cập nhật tầm thường bắn mỗi 30 giây hoặc một cái gì đó), bạn có thể sử dụng một cách an toàn.
Về khả năng tương thích trình duyệt, setTimeout có trước setInterval, nhưng tất cả các trình duyệt bạn sẽ gặp hôm nay đều hỗ trợ cả hai. Straggler cuối cùng trong nhiều năm là IE Mobile trong WinMo <6.5, nhưng hy vọng rằng điều đó cũng đang ở phía sau chúng ta.