2015-11-11 2 views
0

У меня есть таймер javascript, который работает некорректно. Когда я вставляю его в свой браузер, секунды немного отскакивают. Я считаю, что это может быть связано с тем, что миллисекунды не преобразуются правильно в секундах/минутах/часах, но я не уверен. Вот мой код:Javascript секундомер/таймер прыгает

var link = userLink + '/games/' + $scope.currentGame; 
     ref.child(link).once('value', function(snapshot) { 
     var game = snapshot.val(); 
     var startTime = Date.parse(game.started); 
     var timeNow = Date.now(); 
     var timeLapsed = (timeNow - startTime); 
     var mydate = new Date(timeLapsed); 
     var humandate = mydate.getUTCHours()+ " hours, " + mydate.getUTCMinutes()+ " minutes and " + mydate.getUTCSeconds()+ " second(s)"; 
     console.log(humandate); 
     console.log(mydate.getUTCHours()) 
     var timeVar = document.getElementById('timer'), seconds = mydate.getUTCSeconds(), minutes = mydate.getUTCMinutes(), hours = mydate.getUTCHours(), time; 

     function add() { 
     seconds++; 
     if (seconds >= 60) { 
      seconds = 0; 
      minutes++; 
      if (minutes >= 60) { 
       minutes = 0; 
       hours++; 
      } 
     } 
     timeVar.textContent = (hours ? (hours > 9 ? hours : "0" + hours) : "00") + 
     ":" + (minutes ? (minutes > 9 ? minutes : "0" + minutes) : "00") + 
     ":" + (seconds > 9 ? seconds : "0" + seconds); 
     timer(); 
     } 
     function timer() { 
     var time = setTimeout(add, 1000); 
     } 
     timer(); 

    }); 

Начальное время запуска хватает из firebase базы данных по стойкости (таймер предназначен как часть игры), а затем следующие функции приращения времени. Любая помощь будет оценена по достоинству. Благодарю.

+1

1. Пожалуйста, используйте редактор фрагментов для создания фактических рабочих часов. 2. Таймеры JS, как известно, зависят от того, что еще происходит – mplungjan

+0

Даже если речь идет о 'setTimeout', это все равно дубликат этого: http://stackoverflow.com/questions/8173580/setinterval-timing-slowly-drifts -away-from-stay-exact –

+0

см. здесь: https://github.com/developer82/javascript-stopwatch/blob/master/stopwatch.js посмотреть, поможет ли это – developer82

ответ

0

Эта линия:

var time = setTimeout(add, 1000); 

не выполняет каждый второй, но каждый «код времени выполнения + 1 второй» интервал, так что по крайней мере несколько миллисекунд за секунду. Чем дольше работает код, тем он будет менее точным. Попытайтесь использовать setIntervalодин раз вместо того, чтобы звонить setTimeoutкаждую секунду, так как он срабатывает, когда вы ожидаете его.

+2

Даже 'setInterval' будет недостаточно. Самый точный способ - установить новое значение тайм-аута при каждом вызове 'setInterval', например: setTimeout (add, (1000 - (Date.now()% 1000));' –

+0

@atornblad Они будут вести себя почти так же. Что происходит, когда задержка превышает 1000 миллисекунд? – Shomz

+0

Не могу дождаться, чтобы услышать блеск за нисходящим потоком ... – Shomz

0

Вы не можете полагаться на setTimeout для подсчета секунд (или времени в целом). setTimeout просто отложил выполнение функции для как минимум количество времени (в миллисекундах), которое вы задали. Таким образом, в вашем случае может случиться, что функция «добавить» запускается через 1,5 секунды. Причина этого в том, что JavaScript работает в том же потоке, что и пользовательский интерфейс, и это означает, что если есть какая-то задача для потока пользовательского интерфейса, он будет выполнять вашу функцию. setInterval также не будет делать трюк по той же причине.

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

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