Показывать время сервера на клиенте в Meteor
Используя Meteor, какой эффективный способ сохранить текущие часы (h: m: s) на клиенте, который отображает время сервера?
Ответы на JavaScript/PHP, которые я нашел, обычно включают периодическое время сервера и вычисление разницы между этим и клиентом.
Что бы это выглядело с помощью Meteor?
ОБНОВЛЕНИЕ: многое изменилось с тех пор, как я изначально разместил этот вопрос. Если вас интересует готовое решение, я рекомендую взглянуть на Meteor Timesync от @mizzao. Установите его, запустив meteor add mizzao:timesync
в консоли.
Ответы
Ответ 1
Дэвид Гринспен получает клиент в этой презентации на Spark около 14:30. Я немного изменил этот код, чтобы получить время на стороне сервера:
JavaScript:
if (Meteor.isClient) {
Meteor.startup(function () {
setInterval(function () {
Meteor.call("getServerTime", function (error, result) {
Session.set("time", result);
});
}, 1000);
});
Template.main.time = function () {
return Session.get("time");
};
}
if (Meteor.isServer) {
Meteor.methods({
getServerTime: function () {
var _time = (new Date).toTimeString();
console.log(_time);
return _time;
}
});
}
И HTML:
<body>
{{> main}}
</body>
<template name="main">
{{time}}
</template>
Ответ 2
В этой теме есть очень хорошая информация. Я собрал все вместе в смарт-пакет для Meteor:
https://github.com/mizzao/meteor-timesync
Есть две основные вещи, которые я добавил помимо того, что уже здесь:
- Более точное вычисление смещения сервера/клиента с использованием математики NTP-стиля, в отличие от простое время клиента и сервера и игнорирование времени прохождения в оба конца.
- Возможность использовать временные метки сервера для отображения значений, которые будут обновляться в шаблонах и реактивных вычислениях.
Не стесняйтесь открывать запросы на загрузку, особенно если у вас есть идеи для более эффективных/более эффективных способов вычисления и поддержания смещения.
Ответ 3
Спасибо @TimDog за помощь. Я немного расширил этот код, чтобы периодически проверять сервер, сохраняя при этом текущие часы, отображаемые на клиенте. Это то, с чем я столкнулся:
Клиентский код:
Meteor.startup(function () {
function setServerTime(){
//get server time (it in milliseconds)
Meteor.call("getServerTime", function (error, result) {
//get client time in milliseconds
localTime = new Date().getTime();
//difference between server and client
var serverOffset = result - localTime;
//store difference in the session
Session.set("serverTimeOffset", serverOffset);
});
}
function setDisplayTime(){
var offset = Session.get("serverTimeOffset");
var adjustedLocal = new Date().getTime() + offset;
Session.set("serverTime", adjustedLocal);
}
//run these once on client start so we don't have to wait for setInterval
setServerTime();
setDisplayTime();
//check server time every 15min
setInterval(function updateServerTime() {
setServerTime();
}, 900000);
//update clock on screen every second
setInterval(function updateDisplayTime() {
setDisplayTime();
}, 1000);
});
//pass the clock to the HTML template
Template.register.clock = function () {
return new Date(Session.get("serverTime"));
};
Код сервера:
Meteor.methods({
//get server time in milliseconds
getServerTime: function () {
var _time = (new Date).getTime();
console.log(_time);
return _time;
}
});
Ответ 4
Как продолжение по этому вопросу, является ли это утечкой производительности? Мы вычисляем смещение каждую секунду и меняем сессию на основе этого пересчета.
Означает ли это, что любое другое значение, зависящее от сеанса, также будет пересчитываться каждую секунду?
Можно ли лучше установить что-то еще?
Или просто создайте метод, который при необходимости настраивает локальную дату, vs настраивает переменную интервала и сеанса.
сообщите мне, что вы нашли.