即使在调用abort之后浏览器也会等待ajax调用完成(jQuery)

时间:2009-06-02 20:59:02

标签: javascript jquery xmlhttprequest onbeforeunload abort

我有一些(可能)长时间运行的ajax调用,如果用户导航到另一个页面,我想中止。以下jQuery代码在导航离开页面时调用所有挂起的XMLHttpRequest对象的中止:

$.ajaxSetup({
    beforeSend: function(xhr) {
        $(window).bind('beforeunload', function() {
            xhr.abort();
        });
    }
});

在测试用例中,我强制在被调用的服务器端操作上等待10秒钟。使用Firebug,我确认上面的代码确实导致所有挂起的ajax调用在我单击页面上的任何链接时立即停止。但是,浏览器仍然等待整整10秒,然后再转到下一页。 IE似乎表现出相同的行为。这是一个已知的浏览器行为吗?在这种情况下,我能做些什么让用户立即离开页面?提前谢谢。

7 个答案:

答案 0 :(得分:29)

感谢您的回复!事实证明,这是一个浏览器问题我完全错了 - 问题出在服务器上。 ASP.NET序列化需要会话状态的同一会话的请求,因此在这种情况下,在完成那些ajax启动的请求之前,下一页不会在服务器上开始处理。

不幸的是,在这种情况下,响应ajax调用的http处理程序中需要会话状态。但是只读访问是足够好的,因此通过使用IReadOnlySessionState而不是IRequiresSessionState标记处理程序,不会保持会话锁定并解决问题。

希望这些信息对他人有用。

答案 1 :(得分:12)

关于托德自己对这个问题的回答......

我刚刚遇到了PHP的这个问题,同样的解决方案也有效。但是我需要会话中的信息。对于PHP开发人员,您可以在请求过程中调用session_write_close()来关闭并写出您的会话。这将释放其他请求的会话。

答案 2 :(得分:3)

您可能想要检查abort()

的奇怪副作用
  

使用abort()方法时,在Explorer和Mozilla中触发readystatechange事件。更糟糕的是,readyState = 4,这意味着平均xmlhttp脚本假定数据已正确加载。这可能会产生非常奇怪的效果。

记录在这里:

http://www.quirksmode.org/blog/archives/2005/09/xmlhttp_notes_a_1.html

答案 3 :(得分:2)

您确定要使用异步请求吗?如果浏览器在整个请求期间阻塞,则表示您正在使用同步请求(async参数为false)

答案 4 :(得分:1)

我正在使用的Apache / Php服务器也存在服务器问题。删除了不需要它的脚本(AJAX)上的session_start,一切都按预期工作。 感谢托德指出了类似的问题!

答案 5 :(得分:0)

参考接受的答案:

http://improve.dk/optimizing-performance-programmatically-setting-readonlysessionstate/

关于IRequiresSessionState

  

这意味着,对于给定的会话,只能同时执行一个请求。来自同一会话的任何其他请求将阻塞,等待会话被释放

答案 6 :(得分:0)

对于ASP.NET MVC,您可以使用以下[SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)]装饰控制器。

更多信息可以在这里找到... http://johnculviner.com/asp-net-concurrent-ajax-requests-and-session-state-blocking/