2014-09-02 4 views
0

У меня есть немного Node.js кода, например:Почему setTimeout срабатывает раньше, чем нужно?

var start = Date.now(); 

setTimeout(function() { 
    console.log(Date.now() - start); 
    for (var i = 0; i < 100000; i++) { 
    } 
}, 1000); 

setTimeout(function() { 
    console.log(Date.now() - start); 
}, 2000); 

Что-то странное происходит, когда я запускаю его на моей машине. Время, которое я получаю, - это что-то между 970 и 980 годами, и что-то между 1970 и 1980 годами. Почему я получаю время, которое раньше, чем время ожидания?

+2

В каком браузере? Safari возвращает числа, такие как 1002 и 2001, аналогичные в Chrome и Firefox. – RobG

+0

Прежде всего, вы должны удалить этот цикл 'for' - использование таких конструкций в JS никогда не будет хорошей идеей. В JS нет эквивалента функции 'sleep', и попытка создать подобный эффект с использованием таких длинных циклов - это полная бессмыслица, которая почти во всех случаях приведет к непредсказуемым или ненадежным результатам. – CBroe

+0

Я получаю 1002 и 2002 соответственно. –

ответ

1

Из node.js setTimeOutdocumentation:

Важно отметить, что ваш обратный вызов не будет, вероятно, можно назвать точно задержать миллисекунды - Node.js не дает никаких гарантий относительно точных сроков, когда будет вызван обратный вызов, а также не будет заказано . Обратный вызов будет вызван как можно ближе к указанному времени.

Однако есть nanotimer играть:
https://www.npmjs.org/package/nanotimer

Некоторые смежные вопросы:

Однако, я думаю, что +/- 3 0ms рано немного (по сравнению с большинством браузерами Я играл с ними, они обычно не более 10 мс позже (до тех пор, пока процессор не будет превышен, то есть)).

2

Я считаю, что вы испытываете эти проблемы из-за точности даты. Он может варьироваться между платформами и браузерами.

Here более подробно прочитано о точности Даты.

На некоторых платформах есть более высокоточные таймеры available, но вам часто придется немного смешивать и сопоставлять (обнаруживать, что доступно и регрессировать соответственно).