Javascript PreforeUnload中的ajax能否可靠地执行?

Javascript PreforeUnload中的ajax能否可靠地执行?,javascript,ajax,Javascript,Ajax,我有一个HTML5应用程序,当用户更改/刷新页面时,它需要发送一个断开ajax连接的请求。我目前正在使用此代码: window.addEventListener("beforeunload", function(event) { $.ajax({ url: api_disconnect, data: { identifier: token }, method: "GET" }); }); 我不需要处理响应,甚至不需要确保浏览器收到

我有一个HTML5应用程序,当用户更改/刷新页面时,它需要发送一个断开ajax连接的请求。我目前正在使用此代码:

window.addEventListener("beforeunload", function(event) {
    $.ajax({
        url: api_disconnect,
        data: { identifier: token },
        method: "GET"
    });
});
我不需要处理响应,甚至不需要确保浏览器收到响应。我的问题是,我可以依赖接收请求的服务器吗?

如果没有,我如何才能做到这一点?目前,我让应用程序每隔15秒发送一个“我还活着!”请求(这已经让人感觉太多了)。我希望服务器知道用户断开连接的第二秒


澄清一下,我知道如果浏览器/计算机崩溃,我对此无能为力。这就是心跳的作用。我的意思是,在一个正常的用例中,当用户关闭/更改/刷新页面时。

您不能100%依赖ajax调用。您可以测试许多浏览器和操作系统,并确定哪些浏览器和操作系统通常会在页面被删除之前发送ajax调用,但任何规范都不能保证这样做

您正在使用的心跳是最常见的工作方式。这还包括网络连接丢失、断电、计算机睡眠模式或浏览器崩溃,而
beforeunload
处理程序不会这样做


我所讨论的另一个解决方法是使用socket.io连接到服务器。由于socket.io连接有一个小而高效的心跳信号,并且当页面关闭时,服务器将看到套接字关闭,您可以从这两个方面获得最佳效果,因为您将通过心跳看到异常关闭,并且通过webSocket连接立即看到正常关闭。

答案很简单,不,您不能!正如@adeneo所说,没有。想想当你的客户崩溃/计算机爆炸时会发生什么。您可能想看看WebSocket发送“hearbeat”是最可靠的方法,即使客户端没有崩溃,一些浏览器甚至在ajax调用之前就关闭了。我意识到无法知道崩溃(例如)何时发生,但是在我的问题中,我声明
当用户更改/刷新页面时。
如果没有任何失败的原因(如前面所讨论的,客户端崩溃-服务器崩溃,网络问题等),那么是的,这将起作用。