【发布时间】:2018-05-30 12:22:15
【问题描述】:
我正在使用可观察的计时器来计算拍卖的剩余时间,并且不想依赖于客户端时间。因此,我对返回本地化时间的 API 进行服务调用,然后创建每 1 秒调用一次的可观察计时器,我可以在服务器时间上增加 1 秒以复制客户端上的当前服务器时间。
问题是,每 15 分钟后,服务器时间与我们的计时器给出的时间之间存在大约 6 秒的差距。在一个小时内,差异会增加到 40 秒左右,并且只要我们不刷新或重新打开页面,它就会继续增加。
我知道这听起来很傻,但是在 1 秒间隔后调用的可观察计时器正在减慢一点(每 10 分钟左右 3 秒)。
这是我正在使用的代码:
//get the server date
this.service.getServerTime().subscribe(serverDate => {
this.serverDate = serverDate;
}, error => { });
要启动计时器,我正在使用
//start the timer using observable
let timer = Observable.timer(1000, 1000);
this.timerSubscription = timer.subscribe((t: any) => {
this.timerExecuted();
});
private timerExecuted(): void {
if (!this.serverDate) {
return;
}
//add 1 second to the server date
this.serverDate.setSeconds(this.serverDate.getSeconds() + 1);
//console log the server date after adding 1 second
console.log(this.serverDate);
}
当我检查console.log(this.serverDate) 时,最初它以正确的日期开始。假设时间是:07:15:00PM,恰好一个小时后,记录的时间将是 08:14:20PM。 24 小时后,奇怪的是,记录的时间大约是06:45PM,这与目标相差甚远。
主要目标是让服务器时间在客户端实时运行,而不必依赖用户的本地时钟。当用户以角度登陆时,我从服务器获取当前时间,使用 observable(1 秒间隔)启动计时器并在我收到的服务器时间中添加秒数。我从 observable 收到的滴答声在几分钟内显着减慢。
【问题讨论】:
-
这实际上在内部使用
setTimeout,这并不意味着提供完美的时钟精度。每隔 n 秒左右与您的服务器时间同步可能是最简单的。 -
@IngoBürk 这将使服务器超载,因为它是一个有很多拍卖的现场拍卖网站!为每个拍卖/用户/秒向服务器发送调用将创建对服务器的大量调用
-
您不必每秒钟都拨打电话,只需定期拨打电话,而不仅仅是最初。您也可以使用服务器时间作为开始时间,但依靠客户端时间差异来获得更准确的时间增量(如果需要)。
-
哇太棒了,这听起来很合理!非常感谢!
-
在您的特定情况下,提高准确性 === 在拍卖进入时(例如,最后一分钟)服务器调用的频率也可能有意义。假设拍卖不会同时结束,这将大大减少整个平台的负载..
标签: angular timer rxjs observable