ajax - 关闭长轮询连接,jQuery-ajax

标签 ajax jquery long-polling ajax-polling

背景
我使用类似 Tornado 的服务器,支持长轮询。用户访问的每个新网页都会向服务器设置一个长轮询,如下所示:

$.ajax({
    type: 'GET',
    url: "/mylongpollurl/",
    dataType: 'application/json',
    success: function(json) {
        // I do stuff here
    },
    error: function(xhr, errText, ex) {
        // If timeout I send a new long-poll request
    }
});

问题
现在,我将依靠从 Fiddler 获得的数据来监视从我的浏览器(目前为 FF)发出的所有请求。

  1. 第 1 页已加载并发出长轮询请求,现在在服务器端空闲。
  2. 我点击了第 2 页的链接,该页面已加载并设置了长轮询请求,但第 1 页的长轮询请求仍在服务器端闲置(根据 Fiddler)。

这意味着当我在页面周围单击时,我将堆叠所有长轮询调用,从而最终在服务器上产生大量事件连接(或者它们可能共享连接?)

我的想法
- 因为它是一个类似 Tornado 的服务器(使用 epoll),所以它可以处理相当多的连接。但我认为这个事实是不可利用的。我的意思是,在这种情况下,我不希望服务器超时(如果客户端消失)。
- 我知道那些独立页面更好地使用公共(public)头,并且仅通过 ajax 调用交换内容,但我们今天使用的这种设计不是我的决定...
- 解决此问题的最佳方法可能是重用连接(我认为很难关闭)或在浏览器离开页面(单击另一个页面)后立即关闭连接。

谢谢
--MyGGaN

最佳答案

对于长轮询连接,您需要确保在 Fiddler 中设置了“Streaming”选项。否则,Fiddler 将保持连接打开状态,无限期地等待响应完成。

通常,当您从一个页面导航到另一个页面时,客户端应该断开打开的长轮询连接,从而有效地关闭连接。我说应该是因为这并不总是能正常工作,例如,当您关闭 IE 中的弹出窗口时。

关于ajax - 关闭长轮询连接,jQuery-ajax,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1522433/

相关文章:

javascript - Tampermonkey:在动态 AJAX 页面上按下按钮时复制源代码

javascript - Ext.Ajax.request有response.status代码列表吗?

javascript - Owl Carousel 不会自动播放

python - Tornado redis错误: "finish() called twice"

http - request.close 事件不会在 node.js 服务器中触发

javascript - 无法从 Ajax 调用获取 'bad response'

javascript - 单击另一个 div 时打开 div

jquery - 将 Youtube 嵌入 Modal 时出现访问被拒绝错误

javascript - 使用 jquery 迭代 json 仅返回第一个对象

python - Tornado 长轮询请求