我正在尝试使用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');
获取服务器时间,以便在计时器代码中使用。问题是,如果我在两个不同的浏览器上使用计时器并刷新其中一个,那么在该浏览器上更改计时器不会影响另一个浏览器上的计时器,因为会将服务器时间保持在会话上。
我正在寻找一种方法,这样无论用户在他/她的浏览器上做什么,计时器都不会受到影响,并且它应该始终与使用服务器时间的每个浏览器相同。
还有其他方法/想法可以解决这种情况并使计时器保持统一吗?
提前致谢。
答案 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毫秒。