我的网络应用程序使用“长轮询”方法来与服务器上的最新数据保持同步。服务器只有在有新数据时才响应,这可能相隔很多分钟。 (这是一个供暖控制系统,您只能在室温变化或有人更改设置时看到更新)。
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 分钟后会发生一些奇怪的事情。发帖请求似乎被丢弃了,我认为这是合理的,因为手机正在休眠。在 Chrome 调试器的网络选项卡中,POST 请求的状态文本显示为(已取消)。
问题是当我在取消请求时唤醒手机时,success() 或 error() 函数都没有被调用,而且我的网络应用程序永远不会更新。 $.ajax() 违背了 promise 给我回电话。
该问题只发生在某些设备上。通过从 friend 那里借用设备,我已经能够进行一些临时测试。到目前为止,我只在安卓手机上看到过这个问题。但不是手机连接了充电器。我没有在任何平板电脑、苹果设备或 Windows PC 上看到它。
我尝试在 ajax 设置中添加超时:
timeout: 120 * 1000,
这很有帮助,因为 error() 函数最终会在唤醒后最多 2 分钟被调用。但我希望用户在 1 或 2 秒内看到更新。我不想将超时设置得如此短,因为它会产生不必要的服务器流量。
我还尝试通过在一秒 setInterval 中查找延迟来检测设备是否处于 sleep 状态,如 Can any desktop browsers detect when the computer resumes from sleep? 中所述。 . 当我检测到唤醒时,我中止()该帖子并开始另一个。这在大多数情况下都有帮助。但事实证明这是不可靠的。有时时间事件似乎在 sleep 期间正常滴答作响,并且发布请求无论如何都会被取消。而且它感觉不像是可靠的修复程序。
我使用的是最新版本的 jQuery:(2.1.2) 和 Chrome (47)。
最佳答案
我不确定这是否有效,我现在无法测试但试一试
$(window).focus(function() {
updater();
});
关于javascript - 电话休眠后长轮询 jQuery.ajax() 无法回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34340878/