如何在页面离开时终止长轮询 Ajax 请求

Posted

技术标签:

【中文标题】如何在页面离开时终止长轮询 Ajax 请求【英文标题】:How to terminate long poll Ajax request at page leaving 【发布时间】:2012-09-15 00:38:46 【问题描述】:

我有长轮询 Ajax 请求。浏览器,至少但不是最后一个 IE 不会在页面离开时终止请求,因此即使用户访问其他站点,请求也会保持打开和活动状态。多说,浏览器可以成功地处理来自这个连接的响应,尽管它们的结果无处可去。作为调用 htmlxml 连接中止或停止窗口的一般建议显然不起作用。 所以我的实现是在卸载时添加额外的 Ajax 调用,以通知服务器连接持有者该页面处于休假状态,因此它可以发送一些虚拟响应,并且浏览器将在之后将连接返回到可用池。这种方法有效,但看起来我过度设计了。不幸的是,我可以在其他一些程序(如 GMAIL)上观察到类似的问题,它也会进行长时间轮询,结果在重新加载后它停止工作。因此,如果有人找到了解决问题的好方法,而无需切换到短轮询或分配连接超时,那么请分享您的解决方案。

【问题讨论】:

【参考方案1】:

IE 的 XHR 上有一个 abort() 方法,可以手动断开它。

这有点hacky,但您可以尝试以下方法:

<body onbeforeunload="AbortMyAjax()">

并使用该方法中止任何活动的长轮询。

作为参考,下面是我的一个项目中的一些代码:

$this.lp = null;
function _LongPoll() 
    $.ajaxSetup( cache: false );
    $this.lp = $.getJSON(m_PollUrl, _LongPollCallback);

并且在正文之前卸载:

if(!!QueueManager.lp && !!QueueManager.lp.abort) QueueManager.lp.abort('PAGE_CLOSED');

【讨论】:

以上是关于如何在页面离开时终止长轮询 Ajax 请求的主要内容,如果未能解决你的问题,请参考以下文章

Tornado-长轮询_webSocket

求教,django与长轮询,该怎么解决

轮询与长轮询

长轮询冻结浏览器并阻止其他 ajax 请求

ajax长轮询

Django,Ajax 长轮询,Postgresql:空闲事务