我有一个网络应用程序,基本上可以被视为一个消息系统——人们可以提交消息,其他人也可以接收它。这一切都通过 AJAX 进行,Javascript 前端与 PHP 后端交互。所有这些都工作得很好,没有任何问题。
我还实现了通知系统,在收到新消息时向桌面或 Android 应用程序发送推送通知。这也完全可以正常工作。
通知系统使用setTimeout定期检查PHP AJAX系统。但这就是破坏交易问题出现的地方。
当在 Android 上失去关注时,settimeout 变得完全不可靠 - 有时它会起作用,有时根本不起作用,有时会很晚。
为了解决这个问题,我随后将所有内容移至支持人员中,因为我认为这将独立于所关注的浏览器而工作,但这更糟糕 - 似乎它比在浏览器上运行 settimeout 更不稳定。
那么有什么方法可以纠正这个问题吗?我可以在支持人员中放置一些特殊指令以使其不休眠吗?
谢谢你。
此 API 不保证计时器将完全按计划运行。由于 CPU 负载、其他任务等原因造成的延迟是预料之中的,这可能会导致实际延迟可能比预期要长。
您可以在 MDN 上阅读有关 setTimeout 延迟及其可能延迟更长时间的原因的更多信息。
如果您需要即时消息传递之类的功能,您应该研究专门用于此类功能的架构和协议。像带有事件的 WebSockets 这样的东西更适合这个用例。
解决方案是使用 Page Visibility API 在页面失去/获得焦点时禁用/启用计时器。
这允许您确定页面何时失去焦点(即用户切换选项卡、隐藏 Chrome 应用程序(移动)等。
document.addEventListener('visibilitychange', function()
{
if (document.visibilityState === 'hidden')
{
// suspend and preserve your timers here
}
else
{
// restart your timers here
}
});
这还有一个额外的好处,即当用户离开您的选项卡时减少带宽:您可以停止刷新计时器,直到它们回来。