代码之家  ›  专栏  ›  技术社区  ›  Todd Menier

浏览器等待Ajax调用完成,即使调用了abort(jquery)。

  •  27
  • Todd Menier  · 技术社区  · 15 年前

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

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

    在一个测试用例中,我强制在被调用的服务器端操作上等待10秒。使用Firebug,我确认了上述代码确实会导致当我单击页面上的任何链接时,所有挂起的Ajax调用立即停止。但是,在进入下一页之前,浏览器仍会等待10秒钟。IE表现出同样的行为。这是已知的浏览器行为吗?在这种情况下,我能做些什么让用户立即离开页面吗?事先谢谢。

    6 回复  |  直到 9 年前
        1
  •  29
  •   Todd Menier    15 年前

    谢谢你的回复!事实证明,我完全错误地认为这是一个浏览器问题——问题出在服务器上。ASP.NET对需要会话状态的同一会话的请求进行序列化,因此在这种情况下,在这些Ajax启动的请求完成之前,下一页不会在服务器上开始处理。

    不幸的是,在这种情况下,响应Ajax调用的HTTP处理程序需要会话状态。但是只读访问已经足够好了,因此,通过用IReadonlysessionState而不是IRequiressessionState标记处理程序,会话锁不会被持有,并且问题已得到解决。

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

        2
  •  11
  •   chelmertz user1604064    9 年前

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

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

        3
  •  3
  •   Tahir Akhtar    15 年前

    您可能想检查abort()的一个奇怪的副作用。

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

    记录如下:

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

        4
  •  2
  •   fbuchinger    15 年前

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

        5
  •  1
  •   Artistan    14 年前

    我使用的Apache/PHP服务器也存在服务器问题。删除了会话\在不需要它的脚本(Ajax)上启动,一切都按预期工作。 多亏托德指出了一个类似的问题!

        6
  •  0
  •   EvertonMc    9 年前

    参考接受的答案:

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

    关于 IRequiresSessionState

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