【问题标题】:Browser waits for ajax call to complete even after abort has been called (jQuery)即使在调用 abort (jQuery) 之后,浏览器也会等待 ajax 调用完成
【发布时间】:2010-10-30 19:47:22
【问题描述】:

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

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

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

【问题讨论】:

  • Ajax 调用是什么样的?

标签: javascript jquery xmlhttprequest onbeforeunload abort


【解决方案1】:

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

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

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

【讨论】:

  • 您有任何参考资料可以更详细地解释这一点吗?
  • @Phil,我在这里找到了有关 ASP.NET 这个问题的更多信息:johnculviner.com/…
  • 如果我们使用会话状态(读取和编辑)是否可以避免等待?
【解决方案2】:

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

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

【讨论】:

  • @acdameli 我应该在我的函数中调用 session_write_close() 导致问题还是稍后调用的函数
【解决方案3】:

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

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

在此记录:

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 服务器实际上正在停止导航,因为它要导航到的页面使用与正在运行并保持会话的 AJAX 请求相同的会话。
    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

      参考接受的答案:

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

      关于IRequiresSessionState

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

      【讨论】:

      • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
      【解决方案7】:

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

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

      【讨论】:

        猜你喜欢
        • 2012-05-04
        • 1970-01-01
        • 1970-01-01
        • 2017-10-23
        • 1970-01-01
        • 1970-01-01
        • 2014-07-06
        • 2010-10-19
        • 2014-05-30
        相关资源
        最近更新 更多