setTimeout 在 Android 中的 Chrome 上失焦时不可靠 - 有解决方案吗?

问题描述 投票:0回答:2

我有一个网络应用程序,基本上可以被视为一个消息系统——人们可以提交消息,其他人也可以接收它。这一切都通过 AJAX 进行,Javascript 前端与 PHP 后端交互。所有这些都工作得很好,没有任何问题。

我还实现了通知系统,在收到新消息时向桌面或 Android 应用程序发送推送通知。这也完全可以正常工作。

通知系统使用setTimeout定期检查PHP AJAX系统。但这就是破坏交易问题出现的地方。

当在 Android 上失去关注时,settimeout 变得完全不可靠 - 有时它会起作用,有时根本不起作用,有时会很晚。

为了解决这个问题,我随后将所有内容移至支持人员中,因为我认为这将独立于所关注的浏览器而工作,但这更糟糕 - 似乎它比在浏览器上运行 settimeout 更不稳定。

那么有什么方法可以纠正这个问题吗?我可以在支持人员中放置一些特殊指令以使其不休眠吗?

谢谢你。

javascript android settimeout
2个回答
0
投票

此 API 不保证计时器将完全按计划运行。由于 CPU 负载、其他任务等原因造成的延迟是预料之中的,这可能会导致实际延迟可能比预期要长。

您可以在 MDN 上阅读有关 setTimeout 延迟及其可能延迟更长时间的原因的更多信息。

如果您需要即时消息传递之类的功能,您应该研究专门用于此类功能的架构和协议。像带有事件的 WebSockets 这样的东西更适合这个用例。


0
投票

解决方案是使用 Page Visibility API 在页面失去/获得焦点时禁用/启用计时器。

这允许您确定页面何时失去焦点(即用户切换选项卡、隐藏 Chrome 应用程序(移动)等。

document.addEventListener('visibilitychange', function() 
{
    if (document.visibilityState === 'hidden')
    {
        // suspend and preserve your timers here
    }
    else
    {
        // restart your timers here
    }
});

这还有一个额外的好处,即当用户离开您的选项卡时减少带宽:您可以停止刷新计时器,直到它们回来。

© www.soinside.com 2019 - 2024. All rights reserved.