Я получил этот код здесь:В чем причина JavaScript setTimeout настолько неточна?
var date = new Date();
setTimeout(function(e) {
var currentDate = new Date();
if(currentDate - date >= 1000) {
console.log(currentDate, date);
console.log(currentDate-date);
}
else {
console.log("It was less than a second!");
console.log(currentDate-date);
}
}, 1000);
В моем компьютере, он всегда выполняет правильно, с 1000 в консоли вывода. Заинтересовано в другом компьютере, тот же самый код, тайм-аут обратный вызов начинается менее чем за второй и разность currentDate - date
между 980 и 998.
Я знаю о существовании библиотек, которые решают эту неточность (например, Tock).
В основном, мой вопрос: Каковы причины, по которым setTimeout
не срабатывает при данной задержке? Может быть, компьютер слишком медленный, и браузер автоматически пытается адаптироваться к медлительности и запускает событие раньше?
PS: Вот скриншот кода и результаты выполняются в консоли Chrome JavaScript:
Разница между 1-2 миллисекундами (более 1000 миллисекунд), вероятно, связана с джиттером. Почему думаете, что это неточно? Это 1/5 процента. –
John Resig написал хорошую статью об этом :) http://ejohn.org/blog/accuracy-of-javascript-time/ – rorypicko
@ElliottFrisch Я думаю, что это неточно, потому что если я скажу «1 секунду», я хочу просто и точно "1 секунда". Не больше, не меньше. –