5

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

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

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

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

我在这里缺少图片的一部分吗?有谁知道我读完后可以用来释放 responseText 的任何技巧?还是服务器响应可以去其他地方?

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

4

2 回答 2

4

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

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

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

于 2010-04-01T03:59:20.797 回答
1

这就是长轮询的工作原理。您保留一个索引到最后读取的行号,并从该点开始读取间隔的每个刻度。这是一个长连接,因此是一个长响应。

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

于 2009-08-14T04:57:31.450 回答