语境
运是一种进步的Web应用程序具有定时器(A比赛setTimeout
,setInterval
)和WebSocket连接来获得实时通信。
怎么了
只要用户停留在应用程序中,一切都很好。但是,当用户转到另一个选项卡或另一个应用程序或关闭屏幕(在移动设备的情况下)时,它变成了一个“可怕的未知世界”。
- Websocket可能会或可能不会“暂停”或“关闭”
- 计时器看起来像在节流或防抖。
这种行为似乎取决于浏览器和平台,甚至可能取决于特定的用户行为。我想浏览器和操作系统都有自己的生命周期/机制来节省电池和/或计算。
当用户回来时,该应用程序处于未知状态,我正在努力正确恢复该状态。
关于websocket,我可以通过socket.io和reconnecting-websocket自动重新连接,但这还不足以解决所有问题。
寻找答案
- 关于这些浏览器的不同浏览器的“生命周期”是什么?有记录吗?他们什么时候决定关闭并节流?
- 他们对websockets到底做了什么?浏览器只是断开它们的连接?
- 他们到底对计时器做什么?他们会抑制它们或使其反跳吗?
- 一般而言,javascript执行会怎样?暂停/破坏/节流?
- 有什么办法可以关闭某些浏览器生命周期事件?我唯一能找到的可能是可见性API
有没有一种方法可以人为地重现此行为以能够测试解决方案?在台式机上尤其困难。Websocket无法关闭,Chrome开发人员似乎并不急于解决2014年以来的问题(!):使用连接限制时不包含 Websocket
不管以上哪种情况,是否都存在实用的跨浏览器解决方案来检测/解决此问题?(例如,根据经验,台式机上的Firefox的行为似乎与Chrome完全不同,iPhone断开连接的频率要比Android高得多)
相关链接