11

Meteorを使用して、サーバーの時刻を表示するクライアントで実行中の時計(h:m:s)を維持するための効率的な方法は何でしょうか。

私が見つけたJavaScript/PHPの回答には、通常、サーバー時間を定期的に取得し、サーバーとクライアントの差を計算することが含まれます。

Meteorではどのようになりますか?

更新:私が最初にこの質問を投稿してから、多くの変更がありました。事前に構築されたソリューションに興味がある場合は、@mizzaoによるMeteorTimesyncを参照することをお勧めします。meteor add mizzao:timesyncコンソールで実行してインストールします。

4

5 に答える 5

21

David Greenspanは、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>
于 2013-01-09T01:03:12.580 に答える
8

このスレッドには非常に良い情報があります。Meteorのスマートパッケージにすべてをまとめました。

https://github.com/mizzao/meteor-timesync

すでにここにあるもの以外に、私が追加した主なものが2つあります。

  • クライアントとサーバーの時間を単に比較し、ラウンドトリップ時間を無視するのではなく、NTPスタイルの計算を使用したサーバー/クライアントオフセットのより正確な計算。
  • サーバーのタイムスタンプをリアクティブに使用して、テンプレートおよびリアクティブ計算で更新される値を表示する機能。

特にオフセットを計算して維持するためのより良い/より効率的な方法についてのアイデアがある場合は、これについてプルリクエストを開いてください。

于 2014-03-11T17:59:30.360 に答える
6

助けてくれてありがとう@TimDog。そのコードを少し拡張して、実行中の時計をクライアントに表示したまま、サーバーを定期的にチェックするだけにしました。これは私が最終的に得たものです:

クライアントコード:

  Meteor.startup(function () {

    function setServerTime(){

      //get server time (it's 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;
    }

  });
于 2013-01-10T01:59:26.513 に答える
0

この質問のフォローアップとして、これはパフォーマンスの低下ですか?毎秒オフセットを計算し、この再計算に基づいてセッションを変更しています。

これは、セッションに依存する他の何かも毎秒再計算されることを意味しますか?

他の何かに着手したほうがいいでしょうか?

または、間隔とセッション変数を設定するのではなく、必要に応じてローカルの日付調整を行うメソッドを作成するだけです。

あなたが見つけたものを教えてください。

于 2013-04-22T06:38:53.510 に答える
0

通常のコレクションに登録して、日付を入力するだけです:(往復計算なし)

import { Meteor } from 'meteor/meteor';
import { Mongo } from 'meteor/mongo';

export const ServerDate = new Mongo.Collection(null);

if (Meteor.isServer) {
  // This code only runs on the server
  Meteor.publish('serverDate', function serverDatePublication() {
    return ServerDate.find({});
  });
  console.log('<ServerDate>:', new Date());
  Meteor.setInterval(updateDate, 1000 * 1);
}

function updateDate() {
  // Clean out result cache
  ServerDate.remove({});
  ServerDate.insert(new Date());
}
于 2018-03-21T20:29:40.913 に答える