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

标签 javascript jquery ajax google-chrome long-polling

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

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/

相关文章:

javascript - jQuery 在 mouseout() 菜单或子菜单后关闭当前子菜单

javascript - 防止散列作为 anchor

javascript - 将内联 js 移动到外部 js 文件导致错误

javascript - 使用 JQuery 自动填充输入字段

javascript - 在 div 之外 react Javascript onclick

jquery - 将 jQuery POST 发送到 Django View

c# - 模态弹出窗口中的客户端验证?

ajax - 我可以将自定义错误从 JsonResult 返回到 jQuery ajax 错误方法吗?

javascript - 如何更改引用链接?

javascript - 使用 Javascript 隐藏同名的 DIV