使用服务器时间在Meteor中创建计时器

时间:2014-05-30 04:50:42

标签: javascript meteor

我正在尝试使用meteor中的服务器时间创建一个计时器。在客户端,在Meteor.startup函数内部,我调用服务器以获取服务器时间并将其保存在会话变量中。之后,将使用Meteor.setInterval功能每15分钟进行一次此服务器调用。

在服务器main.js上,

return Meteor.methods({

    getServerTime: function () {
        var d = new Date().getTime();
        return d;
    }

});

在客户main.js上,

Meteor.startup(function() {

   Session.set('serverTime', false);
    // get serverTime on startup
    Meteor.setServerTime();
    // update serverTime every 15min
    Meteor.setInterval(function() { Meteor.setServerTime(); }, 900000);


});

Meteor.setServerTime = function() {
  //get server time (it's in milliseconds)
  Meteor.call("getServerTime", function (error, serverTime) {

    Session.set('serverTime', serverTime);

  });
};

在客户端计时器模板代码中,我从会话Session.get('serverTime');获取服务器时间,以便在计时器代码中使用。问题是,如果我在两个不同的浏览器上使用计时器并刷新其中一个,那么在该浏览器上更改计时器不会影响另一个浏览器上的计时器,因为会将服务器时间保持在会话上。

我正在寻找一种方法,这样无论用户在他/她的浏览器上做什么,计时器都不会受到影响,并且它应该始终与使用服务器时间的每个浏览器相同。

还有其他方法/想法可以解决这种情况并使计时器保持统一吗?

提前致谢。

1 个答案:

答案 0 :(得分:2)

您使用Meteor.setServerTime()获得的是服务器在通话时的时间。

很明显,当你有两个浏览器在不同的时间获得服务器时间时,它们会获得不同的会话值。

如果您希望连接到服务器的所有客户端大约能够告诉服务器时间,您需要解决从NOW时间到获取服务器时间的时间偏移。

我认为我没有很好地解释它并且很不清楚。所以让我们通过代码展示它。

Meteor.call("getServerTime", function (error, serverTime) {
  Session.set('serverTime', serverTime);
  Session.set('timeObtained', Date.now()); //local time when you got the serverTime
});

然后,您将使用该值来解决serverTime NOW。

function realServerTime(){
  return Session.get('serverTime') + (Date.now() - Session.get('timeObtained'));
}

Date.now() - Session.get('timeObtained')是现在时间与服务器时间的时差。

现在这需要几毫秒(或更多,取决于连接)的错误,为了减少这一点,你必须使用延迟近似方法,我不会在这篇文章中介绍。

但如果你在当地环境中,那么很可能不会超过10毫秒。