2013-12-24 3 views
3

Я недавно начал изучать Javascript более подробно и как он выполняется в браузере. В частности, функция setTimeout.Javascript setTimeout надежность времени

Мое понимание заключается в том, что вызов setTimeout(foo,x) передаст дескриптор foo для выполнения после x миллисекунд. Насколько надежно это время? Очевидно, если еще один длительный скрипт все еще выполняется после x миллисекунд, тогда браузер не сможет вызвать foo, но могу ли я быть абсолютно уверен, что setTimeout(foo,101) будет всегда выполняться после setTimeout(foo,100)?

+0

Нет, вы не можете быть абсолютно уверены в чем-либо, а таймеры javascript также не очень точны, но большую часть времени они достаточно точны и будут выполнять функцию достаточно близко к установленному времени. – adeneo

+0

Если я правильно помню, 'setTimeout (foo, x)' будет выполнять 'foo' * не раньше, чем xx миллисекунд *** позже. Документ MDN: https://developer.mozilla.org/en-US/docs/Web/API/Window.setTimeout – Passerby

+0

Как вы знаете, JavaScript работает как однопоточное выполнение, поэтому он будет ждать в Que для своей очереди выполнения , но вы убедитесь, что заданный тайм-аут - это минимальное время. – anand4tech

ответ

1

Прежде всего, таймаут в миллисекундах, поэтому 1 сек = 1000 мс. считают, что. вы всегда можете быть уверены, что задержка 1001 будет ниже 1000. BUT Вы должны помнить, что если 2-й метод ретранслирует изменения первого метода, это не значит, что он будет работать хорошо. первые методы могут принимать в течение разумного времени 3 мс (не сложный), а второй может начаться только через 1 мс после первого, что приведет к сбою вашей надежности при первом методе. Я предлагаю не использовать эту функцию, но в некоторых редких случаях.

вы можете пометить меня в этом ответе на ответ для своего конкретного случая, и я могу предложить правильный способ его работы.

+0

Отредактировано оригинальное сообщение, чтобы отображать миллисекунды, а не секунды. Из того, что вы говорите, кажется, что если первый вызов foo занимает больше 1 секунды, второй вызов foo начнет выполнение до завершения первого вызова? Или вы имеете в виду, что второй вызов начнется с 1 мс после первого вызова? Мое понимание заключалось в том, что выполнение было однопоточным, поэтому он не мог запустить второй вызов, если первый блокировал его. –

+0

javascript is sychro language. в основном функция не запускается раньше, чем остальные заканчиваются. поэтому тайм-аут необходим в очень редких случаях.но использование глобальных переменных опасно, поскольку я говорил о надежности параметров и, как вы говорили, java-скрипт является однопоточным языком, методы не могут быть вызваны в одно и то же время. –

0

Большинство браузеров используют один поток для пользовательского интерфейса и JavaScript, который блокируется синхронными вызовами. Таким образом, выполнение JavaScript блокирует рендеринг.

События обрабатываются асинхронно, за исключением событий DOM.

но setTimeout(function(),1000) трюк очень полезен. Это позволяет:

Позволяет браузерам отображать текущие изменения. Уклонитесь от предупреждения «скрипт слишком долго». Изменение потока выполнения. Opera во многих случаях является особенной, когда дело доходит до тайм-аутов и потоков.

Так что если другая функция выполняется, она будет обрабатывать ее, работая параллельно.

другая вещь до setTimeout(function(),1000) ее время в миллисекундах не в секундах.

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