如果由window.onbeforeunload触发,是否会完成异步ajax查询?

时间:2013-07-23 09:47:03

标签: javascript jquery ajax asynchronous window.onunload

我已对此进行了测试,看起来即使页面卸载,无论选项卡是否关闭或选项卡是否导航到新网址,异步操作都会完成。然而,它所呼叫的服务器非常活泼。

当涉及到异步进程运行和标签被关闭时,幕后的过程是什么 - 浏览器只是在页面启动的异步过程中调用它退出?

1 个答案:

答案 0 :(得分:0)

您不能依赖onbeforeunload和服务器之间onunload的异步调用行为。

我们的开发环境中有一个运行Apache服务器的应用程序--Windows和Unix。事实证明,当服务器配置为处理线程中的请求时 - 默认情况下我们的Windows / dev框 - Ajax将始终完成;当它被配置为处理进程中的请求时 - 默认为我们的Unix / prod环境,它总是会取消!

发生的事情是Ajax请求触发,然后浏览器卸载页面,这会关闭Ajax回复的连接。我们设置了一个测试,其中Ajax调用将在服务器上执行4秒“休眠”以避免任何计时问题。它看起来像一个线程后端,Apache没有注意到客户端关闭连接,直到它从“睡眠”返回,而对于子进程后端,它立即中止了Ajax调用。

答案是在[before] unload事件处理程序中使用同步请求。这将使页面保持打开状态,直到请求完成。这确实意味着当页面切换/重新加载/返回时会有额外的延迟......

...而且您也无法保证 next 页面会看到该请求的结果 - 似乎某些浏览器会在触发onunload事件之前获取下一页!但这是另一个问题的主题。