gpt4 book ai didi

javascript - 电话休眠后长轮询 jQuery.ajax() 无法回调?

转载 作者:可可西里 更新时间:2023-11-01 02:12:46 24 4
gpt4 key购买 nike

我的网络应用程序使用“长轮询”方法来与服务器上的最新数据保持同步。服务器只有在有新数据时才响应,这可能相隔很多分钟。 (这是一个供暖控制系统,您只能在室温变化或有人更改设置时看到更新)。

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com