2015-07-06 4 views
0

Пожалуйста, смотрите следующий код JavaScript:JavaScript setInterval и SetTimeout вопрос времени

var cis_current_time = 0; 

setInterval(function() { 
    cis_current_time += 1; 
},1); 

$("#timingInfo").html(cis_current_time); 
setTimeout(function() { 
    $("#timingInfo").html($("#timingInfo").html() + ', ' + cis_current_time); 
},1000); 

В результате я за исключением того, чтобы получить 0, 1000, но она возвращает 0, число около 200

Пожалуйста, проверьте fiddle.

В чем причина такого поведения?

+0

setInterval не точен –

+0

Уже ответили ранее. 'setTimeout' и' setInterval' имеют минимальную точность 4 ~ 5 мс. Я полагаю (потому что на самом деле он говорит «_ после текущих функций», примерно за миллисекунды »), поэтому вы не сможете запускать каждую миллисекунду. Это уже было показано на SO, но где ... –

+1

, а также быть неточным, это только гарантированные минимумы.Они действительно означают «запустить этот код [повторно] через некоторое время после x миллисекунд». –

ответ

1

setInterval и setTimeout не может быть точным из-за своей конструкции.

Они выполняются движком браузера, а это значит, что браузер может в некоторых случаях отключать их. Для примера, если ваш браузер просто использует один процесс для JavaScript, их можно отключить или, возможно, пройти больше тиков, чем вы определяете, из-за текущего давления на ваше используемое ядро.

Его можно немного улучшить с помощью многопоточного JavaScript, но в любом случае - они не будут на 100% точными.

setInterval только гарантирует новое исполнение/звонок after данного периода времени. Не в точное время. В каждом интервале могут быть различия.

0

комплектInterval функция очень точный, как вы можете видеть на этом fiddle.

Проблема в коде, вы пытаетесь выполнить функцию каждые миллисекунды.

setInterval(function() { 
    cis_current_time += 1; 
},1); 

JavaScript является monothreaded, затем, когда у него есть много инструкций, он складывает их и называть их, когда у него есть возможность, так, именно поэтому он не является точным в вашем случае.

setInterval является не проблема, JavaScript является: JS выполняет функции, когда он может, поэтому она выполняется позже ... Каждая функция связана эта проблема, так setInterval тоже ...

Func (1) с 70ms:

enter image description here

Если Func (1) принимает 130ms:

enter image description here

setInterval точен, но имеет такую ​​же проблему, чем каждая функция в JS.

Image credits

+0

Попробуйте переключиться на другую вкладку, как только вы запустите эту скрипку, затем откройте ее. [Это не совсем точно] (http://imgur.com/lmVTQkp). –

+0

Да вот пример вывода: '30s 990ms, 32s 539m' 1,5 секунд разница! – Ionic

+0

setInterval ** не ** проблема, JavaScript ** это **: он выполняет функции, когда это возможно, поэтому он выполняется позже ... ** Каждая функция связана с этой проблемой, поэтому setInterval тоже **. .. setInterval хорошо выполняет свою работу, когда JavaScript работает обычно ^^ Вот что я думаю –

Смежные вопросы