我已经对此进行了测试,似乎即使页面卸载,异步操作也会完成,无论选项卡是否关闭或选项卡是否导航到新的 url。然而,它调用的服务器非常活泼。
当涉及到异步进程运行和选项卡被关闭时,幕后的过程是什么 - 此时浏览器会在页面已启动的异步进程上调用它退出?
我已经对此进行了测试,似乎即使页面卸载,异步操作也会完成,无论选项卡是否关闭或选项卡是否导航到新的 url。然而,它调用的服务器非常活泼。
当涉及到异步进程运行和选项卡被关闭时,幕后的过程是什么 - 此时浏览器会在页面已启动的异步进程上调用它退出?
您不能依赖服务器之间的 onbeforeunload 和 onunload 中的异步调用行为。
我们有一个在 Apache 服务器上运行的应用程序——在我们的开发环境中运行 Windows,在发行版中运行 Unix。事实证明,当服务器被配置为在线程中处理请求时——我们的 Windows/dev 框的默认设置——Ajax 总是会完成;当它被配置为处理进程中的请求时——默认为我们的 Unix/prod 环境,它总是会取消!
发生的情况是 Ajax 请求触发,然后浏览器卸载页面,从而关闭 Ajax 回复的连接。我们设置了一个测试,其中 Ajax 调用将在服务器上执行 4 秒的“睡眠”以避免任何时间问题。它看起来像一个线程后端,Apache 直到它从“睡眠”返回后才注意到客户端关闭连接,而对于子进程后端,它立即中止 Ajax 调用。
答案是在 on[before]unload 事件处理程序中使用同步请求。这将使页面保持打开状态,直到请求完成。这确实意味着页面切换/重新加载/返回时的额外延迟......
...而且您也不能保证下一页会看到该请求的结果-似乎某些浏览器会在触发 onunload 事件之前获取下一页!但这是另一个问题的话题。