2009-06-02 75 views
25

我有一些(可能)长期运行的ajax调用,如果用户导航到另一个页面,我想中止。在导航离开该页面下面的jQuery代码调用的所有未决的XMLHttpRequest对象中止:浏览器等待ajax调用完成,即使中止已被调用(jQuery)

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

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

+0

Ajax调用是什么样的? – epascarello 2009-06-02 22:53:20

回答

27

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

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

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

+2

我有这样的头痛,非常感谢! – Pablo 2010-08-25 01:49:52

+0

您有任何参考资料可以更详细地解释这一点吗? – Phil 2014-09-22 23:47:32

+0

@Phil,我在这里找到了关于ASP.NET这个问题的更多信息:http://johnculviner.com/asp-net-concurrent-ajax-requests-and-session-state-blocking/ – 2015-05-21 21:09:32

2

您确定您使用的是异步请求吗?如果整个申请过程中的浏览器拦截,您使用的是同步的请求(async参数为false)

+0

服务器实际上是拖延导航,因为它想要导航到的页面使用与正在运行并持续到会话的AJAX请求相同的会话。 – grantwparks 2017-10-27 23:29:28

3

你可能要检查中止的)一个奇怪的副作用(

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

这里记载:

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

1

服务器问题也是我正在使用的Apache/Php服务器的情况。删除了不需要它的脚本的session_start(AJAX),并且所有内容都按预期工作。 感谢托德指出了一个类似的问题!

9

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

我只是用PHP和同解会工作这个问题。不过,我需要会议中的信息。对于PHP开发人员,您可以致电session_write_close()在请求中间关闭并写出会话。这将释放其他请求的会话。