我的网络应用程序使用“长轮询”方法来跟踪我的服务器的最新数据.服务器只有在具有新数据时才可以响应,这可能相差很多分钟. (这是一个加热控制系统,您只能在室温发生变化或有人更改设置时看到更新).
var version = "0"; function updater() { $.ajax({ type: "POST",url: "/listen",data: version,success: function (data) { version = handleUpdates(data); updater(); },error: function () { setTimeout(updater,1000); } }); }
它在桌面浏览器和手机上工作正常,除了一种情况.我已经发现,在Android手机与Chrome的东西奇怪的事情后,手机已经睡了超过约10分钟.帖子请求似乎被删除,我猜这是合理的,因为手机睡着了.在Chrome调试器的“网络”选项卡中,POST请求的状态文本说(已取消).
问题是当我在取消请求时唤醒电话,没有调用success()或error()函数,并且我的Web应用程序从来没有被更新. $.ajax()已经打破了我的回报.
问题只发生在某些设备上.我已经能够通过向朋友借用设备进行一些特别测试.到目前为止,我只看到Android手机上的问题.但是手机没有连接到充电器.我没有在任何平板电脑,苹果设备或Windows PC上看到它.
我已经尝试为ajax设置添加一个超时:
timeout: 120 * 1000,
这有助于因为在唤醒后最多2分钟就会调用error()函数.但是我希望用户在1秒或2秒内查看更新.我不想使超时这么短,因为它会创建不必要的服务器流量.
我也尝试检测设备是否睡眠,通过在一秒钟的setInterval中查找迟到,如Can any desktop browsers detect when the computer resumes from sleep?所述.
当我检测到唤醒时,我中止()该帖子并启动另一个.这在大多数情况下都有帮助.但事实证明是不可靠的.有时,在睡眠期间,时间事件似乎保持正常,并且发布请求也被取消.它不觉得像一个可靠的解决方案.
我正在使用最新版本的jQuery:(2.1.2)和Chrome(47).
解决方法
我不知道这是否工作,我现在不能测试,但试一试
$(window).focus(function() { updater(); });