[英]Angular rxjs Observable.interval() not triggering properly on background tabs in Chrome
[英]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.