我的Web应用程序使用“长轮询”方法来及时获得服务器最新数据。服务器只在有新数据时才作出响应,这可能间隔数分钟。(这是一个供暖控制系统,您只能在室温变化或有人更改设置时才会看到更新)
var version = "0";
function updater() {
$.ajax({
type: "POST",
url: "/listen",
data: version,
success: function (data) {
version = handleUpdates(data);
updater();
},
error: function () {
setTimeout(updater, 1000);
}
});
}
它在桌面浏览器和手机上工作良好,除了一个情况。我发现在使用Chrome的安卓手机上,当手机休眠超过大约10分钟后会发生一些奇怪的事情。POST请求似乎被丢弃了,这很合理,因为手机处于睡眠状态。在Chrome调试器的网络标签中,POST请求的状态文本显示为(canceled)。
问题在于,当我在请求被取消时唤醒手机时,success()或error()函数都不会被调用,我的Web应用程序永远不会得到更新。$.ajax()已经破坏了它的承诺,没有回调给我。
该问题只发生在某些设备上。通过向朋友借用设备,我已经能够进行一些临时测试。到目前为止,我只看到在安卓手机上存在此问题,但是如果手机连接到充电器,则不会出现此问题。我没有在任何平板电脑、苹果设备或Windows PC上看到过这个问题。
我已经尝试将超时添加到ajax设置中:
timeout: 120 * 1000,
这有帮助,因为在设备唤醒后,直到2分钟后才最终调用error()函数。但我希望用户能在1或2秒内看到更新。我不想将超时时间设置得太短,因为这会创建不必要的服务器流量。
我还尝试通过查找一秒钟的setInterval中的延迟来检测设备是否处于休眠状态,如Can any desktop browsers detect when the computer resumes from sleep? 所述。当我检测到唤醒时,我会中止post并开始另一个。这在大多数情况下都有所帮助。但事实证明它不可靠。有时候,在睡眠期间,时间事件似乎正常运行,而post请求仍然被取消。而且它也不感觉像是一个可靠的解决方案。
我正在使用jQuery的最新版本(2.1.2)和Chrome(47)。