2013-07-23 33 views
1

我已经测试过这一点,它看起来像即使页面卸载,异步操作完成,无论标签是关闭还是标签导航到新的url。然而,它所呼叫的服务器非常活泼。如果由window.onbeforeunload触发,异步ajax查询是否会完成?

在运行异步进程和关闭标签页的过程中,幕后过程是什么?浏览器在什么时候调用它,然后退出页面已经启动的异步过程?

+0

[发送AJAX到服务器beforeunload]的可能重复(http://stackoverflow.com/questions/14929832/send-ajax-to-server-beforeunload)。 –

回答

0

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

我们有一个应用程序,它运行在我们的开发环境中的Apache服务器Windows上,以及Unix上的版本上。事实证明,当服务器被配置为处理线程中的请求时(默认为我们的Windows/dev盒),Ajax将始终完成;当它被配置为处理进程中的请求时(默认为我们的Unix/prod环境),它将始终取消!

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

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

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

相关问题