Я пишу функцию счетчика Javascript, но я не совсем уверен.

Предположим, что 1000 мс === 1 с.

    var ms = 0;
    var s = 0;

    setInterval(() => {document.querySelector('#ms').innerHTML = ms++}, 1);
    setInterval(() => {document.querySelector('#s').innerHTML = s++}, 1000);
    <div id="ms">0</div>
    <div id="s">0</div>

Предполагается, что скорость миллисекундной функции, работающей от 0 до 1000, такая же, как у второй функции, работающей от 0 до 1, но результат выглядит так: 1000 мс! == 1 с. Я что-то не понимаю насчет миллисекунды?

Большое спасибо!

1
Kenny 13 Мар 2018 в 21:25

2 ответа

Лучший ответ

Так не работает. Когда вы определяете таймер (setTimeout или setInterval), JS-движок не гарантирует, что он будет работать через 1000 мс, потому что это зависит от того, что он обрабатывает в очереди.

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

Я рекомендую вам эту книгу: https://www.amazon.com/dp/1617292850/ ? tag = stackoverflow17-20. В нем есть глава о событиях, и в ней точно объясняется, о чем вы спрашиваете.

3
Francisco Goldenstein 13 Мар 2018 в 18:28

Веб-браузеры, как и все приложения, по очереди выделяют часть процессорного времени, и время ожидания будет варьироваться в зависимости от нагрузки. Это то, что вызывает задержку в асинхронных таймерах - таймер на 200 мс на самом деле может занять 202 мс или 204 мс, и это постепенно будет посылать секундомер вне времени.

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

Источник: Sitepoint

0
isherwood 13 Мар 2018 в 18:28