【问题标题】:Observable timer ticks slows down with time可观察的计时器滴答随时间变慢
【发布时间】: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


【解决方案1】:

我们注意到,在某些时候,间隔增加了 4 倍。事实证明,一些浏览器会在失焦(非活动标签)时将计时器限制为每秒仅触发一次以节省电池。

可以在hereherehere 找到一些其他信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多