Comet,responseText和内存使用情况

时间:2009-08-14 02:50:54

标签: javascript ajax comet long-polling responsetext

有没有办法在不破坏XHR对象的情况下清除XHR对象的responseText?

我需要保持对Web服务器的持久连接,以将实时数据提供给浏览器。问题是,有相对大量的数据通过(每秒几百K),因此内存使用是一个大问题,因为这种连接必须保持打开至少几分钟。 responseText变得非常快,即使我发回的JSON已经被碾压得尽可能小。

由于服务器端应用程序的工作方式,如果我使用AJAX样式的短轮询并且在完成它时只破坏XHR对象,即使在几毫秒内我也会错过大量的重要数据解析响应,创建一个新的XHR并将其发送出去。我没有选择使用重叠请求,因为Web服务器一次只接受一个连接。 (不要问。)所以Comet正是我需要的模型。

我想要做的是解析从服务器返回的每个JSON块,然后清除responseText以便我可以继续使用相同的连接。但是,responseText是只读的。它不能通过我找到的任何方法直接清空。

我在这里缺少一部分照片吗?当我读完它时,有没有人知道我可以用来释放responseText的任何技巧?或者服务器响应可以到达另一个地方吗?

我没有包含代码,因为这几乎是一个与代码无关的问题。生成XHR并处理返回数据的Javascript例程非常非常简单。

2 个答案:

答案 0 :(得分:4)

与其他回应相反,“长轮询”不是一个长期的联系。 “长轮询”是按顺序连接的许多连接,如果不需要响应,每个连接都设置为在相当长的时间内保持连接。他们超时(通常约25-30秒),然后重新建立新连接。由于HTTP1.1允许重用现有连接,因此无需重新协商连接,因此可以立即重新建立连接。

所以,只需使用多个请求。由于重新建立连接的开销实际上可以忽略不计,并且每个新连接都可以使您破坏以前的响应文本,从性能/开销的角度来看,这是完全可行的解决方案,并且也可以解决您的内存问题。

[编辑]我是根据经验发言,作为WebSync的作者之一。

答案 1 :(得分:1)

这就是长时间轮询的工作原理。您将索引保留在读取的最后一个行号中,并从该点开始读取您的间隔的每个滴答。这是一个长期的联系,因此是一个长期的回应。

新鲜的responseText意味着新的联系。但那时它不再是彗星;)