彗星、responseText和内存使用

5
有没有一种方法可以在不销毁XHR对象的情况下清除XHR对象的responseText?
我需要与Web服务器保持持久连接,向浏览器提供实时数据。问题是,有大量的数据(每秒几百K)不断传输,因此内存使用是一个大问题,因为这个连接必须至少保持几分钟。即使我发送的JSON已经压缩到最小,responseText也会非常快地变得非常大。
由于服务器端应用程序的工作方式,如果我使用AJAX-style短轮询并在完成后销毁XHR对象,即使在解析响应,创建新XHR并将其发送出去的几毫秒内,我也会错过大量重要数据。我无法使用重叠请求选项,因为Web服务器一次只接受一个连接。(别问我为什么。)因此Comet正是我需要的模型。
我想做的是在每个JSON块从服务器返回时解析它,然后清除responseText,以便我可以继续使用同一个连接。但是,responseText是只读的。我找到的任何方法都不能直接清空它。
我是否漏掉了什么?有人知道我可以使用哪些技巧来释放responseText吗?或者还有其他地方可以放置服务器响应吗?
我没有包含代码,因为这实际上几乎是一个与代码无关的问题。生成XHR并处理返回数据的Javascript例程非常简单。
2个回答

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

所以,只需使用多个请求。由于重新建立连接几乎没有开销,而且每个新连接都可以销毁前一个响应文本,从性能/开销的角度来看,这是完全可行的解决方案,也可以解决你的内存问题。

[编辑] 我是WebSync的作者之一,这些是我亲身经历的。


1

这就是长轮询的工作原理。您保持对最后读取的行号的索引,并在每个间隔的滴答声中从该点开始阅读。它是一个长连接,因此是一个长响应。

一个新的responseText表示一个新的连接。但那样它就不再是彗星了 ;)


谢谢。我理解这个模型。我只是希望有一种方法可以保持连接,而不必强制将在该连接上接收到的所有内容存储在一个巨大的缓冲区中。长轮询本来就是一种hack,所以我想要它按照我需要的方式工作可能有些过分要求 :) - glomad
1
@ithcy:这实际上似乎是一个合理的请求。在你问之前,我从来没有想过它太多。xhr.flushResponseBuffer()或类似的东西对于长时间运行的连接可能非常有价值,并且可以避免一直保存该死的行号引用。 - Crescent Fresh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接