浏览器等待ajax调用完成,即使已调用中止(jQuery)

问题描述 投票:29回答:7

我有一些(可能)长期运行的ajax调用,如果用户导航到另一个页面,我想中止该调用。从页面导航后,以下jQuery代码对所有未决的XMLHttpRequest对象调用中止:

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

在一个测试用例中,我在等待服务器端操作被迫等待10秒。使用Firebug,我确认上述代码确实确实导致当我单击页面上的任何链接时,所有待处理的ajax调用立即停止。但是,浏览器仍然需要等待整整10秒钟才能进入下一页。 IE似乎表现出相同的行为。这是已知的浏览器行为吗?在这种情况下,我能做些什么让用户立即离开页面?预先感谢。

javascript jquery xmlhttprequest onbeforeunload abort
7个回答
29
投票

谢谢您的答复!事实证明,对于浏览器问题,我是完全错误的-问题出在服务器上。 ASP.NET对需要会话状态的同一会话的请求进行序列化,因此,在这种情况下,直到这些由ajax发起的请求完成后,下一页才开始在服务器上进行处理。

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

希望此信息对其他人有用。


12
投票

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

我只是在PHP中遇到了这个问题,并且相同的解决方案也可以使用。但是,我需要会议中的信息。对于PHP开发人员,您可以调用session_write_close()关闭并在请求中间写出会话。这将释放会话以处理其他请求。


3
投票

您可能要检查abort()的怪异副作用

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

此处记录:

session_write_close()


2
投票

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


1
投票

服务器问题也是我正在使用的Apache / Php服务器的情况。在不需要脚本的会话中删除了session_start(AJAX),一切正常。感谢托德指出了类似的问题!


0
投票

参考已接受的答案:

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

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

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


0
投票

对于ASP.NET MVC,您可以使用以下IRequiresSessionState装饰控制器。

可在此处找到更多信息... [SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)]

© www.soinside.com 2019 - 2024. All rights reserved.