Подтвердить что ты не робот

Показывать время сервера на клиенте в Meteor

Используя Meteor, какой эффективный способ сохранить текущие часы (h: m: s) на клиенте, который отображает время сервера?

Ответы на JavaScript/PHP, которые я нашел, обычно включают периодическое время сервера и вычисление разницы между этим и клиентом.

Что бы это выглядело с помощью Meteor?

ОБНОВЛЕНИЕ: многое изменилось с тех пор, как я изначально разместил этот вопрос. Если вас интересует готовое решение, я рекомендую взглянуть на Meteor Timesync от @mizzao. Установите его, запустив meteor add mizzao:timesync в консоли.

4b9b3361

Ответ 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 настраивает переменную интервала и сеанса.

сообщите мне, что вы нашли.