|
|
|
JS, правильные серверные часы
|
|||
|---|---|---|---|
|
#18+
Нужно выводить на странице дату и время сервера, обновляемые каждую секунду. Время от времени (раз в минуту или раз в 5 минут) с сервера запрашивается время (timestamp), чтобы обнулить отклонения. Есть функция _query(callback), делающая асинхронный запрос и вызывающая callback-функцию с передачей в нее JSON-объекта с данными (callback-функция вызывается только в случае успешного получения ответа от сервера), json.clock — это timestamp сервера. Я сделал так: Код: javascript 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. Но почему-то время на странице отображается неправильное — вначале увеличивается по 2 секунды, а затем изменения вообще непонятны. ________________________ Мы смотрим с оптимизмом... ...в оптический прицел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2015, 12:48 |
|
||
|
JS, правильные серверные часы
|
|||
|---|---|---|---|
|
#18+
В таком виде часы тикают нормально: Код: javascript 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. В такой реализации серверный timestamp запрашивается при загрузке страницы один раз и впоследствии часы тикают автономно (clock_delta > 100000000). Но как только я включаю периодическую «подводку» часов (clock_delta > 10), начинаются непонятности — вначале время увеличивается на две секунды, а после 10 секунд начинают ходить хаотично, страница начинает потреблять ресурсы и через некоторое время браузер ее прибивает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2015, 13:13 |
|
||
|
JS, правильные серверные часы
|
|||
|---|---|---|---|
|
#18+
Alibek B., А для чего такой изврат? Один раз возьмите время с сервера, высчитайте разницу между timestamp сервера и у вас. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2015, 13:27 |
|
||
|
JS, правильные серверные часы
|
|||
|---|---|---|---|
|
#18+
Страница может быть открыта долго, десятки часов, расхождения могут быть заметными. Кроме того, если пользователь изменит часы на своем ПК, результат будет неадекватным. Поэтому я бы не хотел ориентироваться на локальный таймстамп. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2015, 13:50 |
|
||
|
JS, правильные серверные часы
|
|||
|---|---|---|---|
|
#18+
Причину рекурсии вроде бы нашел — если clock_delta по какой-то причине не обнулялся, то ajax-запрос выполнялся каждую секунду. Текущая версия функции такая: Код: javascript 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. Теперь прогрессирующего потребления ресурсов нет. Но часы все-равно тикают неправильно. Первые 10 секунд часы ходят правильно. Затем clock_delta сбрасывается на ноль. Затем почему-то начинает увеличиваться не на 1, а на 2, и соответственно следующая корректировка часов (вызов _query) происходит не через 10 секунд, а через 5. После этого clock_delta снова сбрасывается на ноль и начинает увеличиваться на 3 или 4 при каждом тике. Никак не найду, где рекурсия осталась. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2015, 14:32 |
|
||
|
JS, правильные серверные часы
|
|||
|---|---|---|---|
|
#18+
Кажется нашел, в чем дело. Асинхронный запрос срабатывает слишком быстро, функция refreshClock все еще выполняется, когда приходит ответ от сервера и она вызывается из _query. В таком виде часы ходят нормально: Код: javascript 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. Но при этом если вдруг _query не выполнится успешно, то часы остановятся. Не подскажите, как это можно обойти? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2015, 15:08 |
|
||
|
JS, правильные серверные часы
|
|||
|---|---|---|---|
|
#18+
Вообщем разбил на три функции, теперь все работает нормально. Код: javascript 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. Почему не работало в одной функции, я пока так и не понял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2015, 15:37 |
|
||
|
JS, правильные серверные часы
|
|||
|---|---|---|---|
|
#18+
Alibek задача решается в одно дейстаие с использованием websocket ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2015, 15:59 |
|
||
|
JS, правильные серверные часы
|
|||
|---|---|---|---|
|
#18+
Каким образом? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2015, 16:01 |
|
||
|
JS, правильные серверные часы
|
|||
|---|---|---|---|
|
#18+
Alibek B., Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. Но вообще это изврат ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2015, 16:26 |
|
||
|
|

start [/forum/topic.php?fid=22&msg=38894513&tid=1446208]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
145ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
29ms |
get tp. blocked users: |
1ms |
| others: | 219ms |
| total: | 430ms |

| 0 / 0 |
