2011-12-08 19 views
27

Tôi có đoạn mã mà tôi muốn kéo dài ít nhất một giây. Vì vậy, tôi làm:Có phải gọi setTimeout với độ trễ âm không?

var currentTimeMillis = new Date().getTime(); 
// do stuff 
var sleepTime = 1000 - (new Date().getTime() - currentTimeMillis); 

Lưu ý rằng sleepTime có thể âm. Tôi có thể làm

setTimeout(callback, sleepTime) 

Hoặc tôi phải kiểm tra giá trị âm một cách rõ ràng?

Trả lời

34

Theo MDN tham khảo, thông số kỹ thuật đòi hỏi rằng có một thời gian chờ tối thiểu.

Nếu bạn cung cấp một cái gì đó ít hơn này (HTML5 spec nói 4ms) thì trình duyệt sẽ chỉ bỏ qua sự chậm trễ của bạn và sử dụng mức tối thiểu.

Vì vậy, âm bản phải ổn, vì nó sẽ chỉ nhỏ hơn mức tối thiểu.


Rõ ràng, điều này không phải luôn luôn như vậy (không phải lúc nào cũng là cách phát triển web!). Theo (http://programming.aiham.net/tag/browser-compatibility/):

Cung cấp setTimeout thời gian âm sẽ không phải lúc nào cũng được gọi là chức năng gọi lại . Điều này hoạt động trong các trình duyệt khác, nhưng trong Internet Explorer (8 hoặc thấp hơn), bạn phải đảm bảo rằng bất kỳ số âm nào lần được đổi thành 0.

Tôi chưa tự thử nghiệm điều này, nhưng như Thomasz đã nói, có lẽ tốt hơn là an toàn.

+9

Vít IE8. Không có thời gian chờ cho u! –

31

Better được an toàn hơn xin lỗi:

setTimeout(callback, Math.max(sleepTime, 0)) 
+0

Thật tuyệt, vì một lý do nào đó tôi nghĩ tôi phải làm 'if (sleepTime> 0) setTimeout (...) else', điều này có vẻ hơi xấu xí hơn một chút. – ripper234

1
if(sleepTime < 0) 
sleepTime = 0; 

setTimeout(callback, sleepTime) ; 

bạn cũng có thể làm tương tự.

1

Hmm ... Các giải pháp đề cập giải quyết vấn đề tại các cuộc gọi đến setTimeout, vì vậy nó cần phải được ghi mỗi lần gọi được thực hiện. Không phải là nó tốt hơn để giải quyết nó trực tiếp trong setTimeout?

// Run this once. 
(function(){ 
    var oldSetTimeout = setTimeout 
    setTimeout = function(callback, delay){ 
     return oldSetTimeout(callback, Math.max(delay, 0)) 
    } 
})() 

// Call setTimeout safely with a negative delay. 
setTimeout(function(){ console.log("Hello World") }, -42) 
Các vấn đề liên quan