繁体   English   中英

Angular 4 RXJS Observable .interval()在后台不起作用

[英]Angular 4 RXJS Observable .interval() Doesn't Work In Background

我有一个简单的可观察计时器,当我的应用中计时器启动时就可以订阅了。 它运作良好,但是如果选择了另一个浏览器选项卡,则计时器停止,直到再次选择应用程序的选项卡。

public timer = Observable
  .interval(100)

有什么办法可以在标签页处于后台时保持可观察的运行?

更新

我简要地研究了如何以Web Worker的身份运行它,但是很快开始阅读有关将Web Workers集成到Angular项目中的困难。

所以目前,我正在使用一种简单的解决方案,即获取计时器的开始时间,并从当前时间中减去该时间,以获取计时器的运行时间。 这样,当选项卡再次变为活动状态时,计时器将自行纠正。

我确实希望页面标题显示计时器计数,以便仅通过查看选项卡即可看到它,因此我仍然想找到一个更好的解决此问题的方法。

Chrome后台的标签页在执行性能方面受到严格限制。 请参阅Chrome团队的以下博客文章: https : //developers.google.com/web/updates/2017/03/background_tabs

Chrome 57附带了基于预算的计时器节流功能,它是计时器对齐机制的进一步扩展,对后台计时器CPU使用率设置了额外的限制。 其操作如下:

  • 每个后台选项卡都有一个时间预算(以秒为单位),用于在后台运行计时器。
  • 网页在后台运行10秒钟后会受到时间预算的限制。
  • 仅当时间预算为非负时,才允许计时器任务运行。
  • 执行计时器后,将从预算中减去其运行时间。
  • 预算会随着时间不断更新(当前设置为每秒0.01秒)。 请注意,随着Chrome收集有关节流行为的更多数据,可以调整此预算再生率。

因此,由于cpu周期的预算限制,在后台运行100毫秒的计时器将不会显着减慢工作速度。

似乎不是这样,这正在工作

let j=0;
Rx.Observable.interval(1000).subscribe((v)=>{
  console.info('j: '+j++);})

在这里查看工作演示: http : //jsbin.com/zufebipawe/edit?html,js,console,output

也可以在这里查看: https : //github.com/ReactiveX/rxjs/issues/3042

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM