Tôi đã gặp sự cố lạ trong Firefox 12. setTimeout() dường như không phải chờ đợi độ dài phù hợp. Hoặc có lẽ đó là mili giây của ngày không jive?Firefox gọi hàm setTimeout quá sớm (hoặc Date.getTime() bị tắt?)
Check out this fiddle. Về cơ bản, một setTimeout 100ms dường như chạy bất cứ nơi nào giữa 80ms và 110ms. Tôi có thể hiểu thêm, dựa trên John Resig's explanation of timers. Nhưng ít hơn?
Bạn có thể phải làm mới nó một hoặc hai lần để xem vấn đề, vì đôi khi nó hoạt động chính xác trong lần chạy đầu tiên. Dường như nó hoạt động mạnh mẽ trong IE và Chrome.
Dưới đây là đoạn code tôi đang sử dụng trong fiddle tôi:
var txt = '',
TIMEOUT_LENGTH = 100,
_now;
now = Date.now || function() { return new Date().getTime() };
function log(time) {
c = time < 100? 'class="error"' : '';
$('#log').append('<p '+c+'>waited ' + time + '</p>');
}
function defer() {
var d = $.Deferred(),
start = now();
setTimeout(function() {
d.resolve(now() - start);
}, TIMEOUT_LENGTH);
return d.promise();
}
for (var i = 0; i < 20; i++) {
defer().then(log);
}
Dưới đây là một mẫu của các đầu ra kỳ quặc:
Dưới đây là thông tin trình duyệt của tôi:
Và cảm ơn rất nhiều h để đọc câu hỏi của tôi! Tôi hy vọng ai đó có thể làm sáng tỏ điều này.
INFO THÊM
tôi làm việc xung quanh vấn đề bằng cách sử dụng setInterval() và kiểm tra mỗi increment để xem thời gian cần thiết đã trôi qua. See this fiddle.
Tuy nhiên, tôi vẫn rất muốn nghe nếu có ai đó có thể làm sáng tỏ nguồn gốc của sự cố
Tôi có thể xác nhận hành vi này trong Firefox 12 trên OS X 10.7. Safari cung cấp bất cứ nơi nào giữa 100 và 105 cho tôi, Firefox 12 80s-110s cho lần chạy đầu tiên, chạy tiếp theo là ... 95-105. – Aaron
Vui mừng khi biết đó không chỉ là tôi :) – Kato
Vì vậy, đó là tất cả những gì chúng tôi nhận được sau đó. Có lẽ tôi sẽ mở ra một lỗi trên tại mozilla chỉ để xem những gì họ nói :) – Kato