2009-08-14 52 views
5

有沒有辦法清除XHR對象的responseText而不破壞XHR對象?Comet,responseText和內存使用

我需要保持一個持久連接對Web服務器開放,以將實時數據提供給瀏覽器。問題是,有相當多的數據通過(每秒幾百K),所以內存使用率是一個大問題,因爲此連接必須保持打開至少幾分鐘。 responseText非常快速地變得非常大,儘管我發回的JSON已經儘可能小。

由於服務器端應用程序的工作原理,如果我使用AJAX風格的短輪詢並在完成XHR對象時銷燬XHR對象,即使在幾毫秒內也會丟失大量重要數據需要解析響應,創建一個新的XHR並將其發送出去。我沒有選擇使用重疊的請求,因爲Web服務器一次只接受一個連接。 (別問。)所以彗星正是我需要的模型。

我想要做的是解析每個JSON塊,因爲它從服務器回來,然後清除responseText,以便我可以繼續使用相同的連接。但是,responseText是隻讀的。它不能通過我找到的任何方法直接清空。

有沒有我在這裏失蹤的圖片的一部分?有沒有人知道我讀過它時可以用來釋放responseText的任何技巧?還是有另一個服務器響應可以去的地方?

我不包括代碼,因爲這實際上幾乎是一個代碼不可知的問題。產生XHR並處理返回數據的Javascript例程非常非常簡單。

回答

1

這就是多長時間投票的作品。您保留一個索引到最後一行的讀數中,並從該點開始讀取您的間隔的每個時間間隔。這是一個長期的聯繫,因此是一個長期的迴應。

新鮮的responseText意味着一個新的連接。但它不會再是彗星了)

+0

謝謝。我理解這個模型。我只是希望有一種方法可以保持連接,而不會被迫在一個巨大的緩衝區中存儲在該連接上收到的所有內容。 無論如何,長輪詢是一種黑客行爲,所以我想這需要很多才能讓它按我需要的方式工作:) – glomad 2009-08-14 21:21:24

+1

@ithcy:它實際上看起來像一個合理的請求。直到你問起,我從來沒有想過這件事。一個'xhr.flushResponseBuffer()'或其他東西對於長時間運行的連接可能是有價值的,並且會節省不得不一直保存該死的行號參考。 – 2009-08-14 21:26:35

4

與其他響應相反,「長輪詢」不是一個長連接。 「長輪詢」是按順序連接的許多連接,如果不需要響應,每個連接都會保持相當長的時間。他們超時(通常大約25-30s),然後重新建立一個新的連接。由於HTTP1.1允許重複使用現有連接,因此不必重新協商連接,因此可以立即重新建立連接。

所以,只需使用多個請求。由於重新建立連接的開銷確實微乎其微,並且每個新連接都將使您能夠銷燬先前的響應文本,所以從性能/開銷的角度來看,這是完全可行的解決方案,並且還可以解決您的內存問題。

[編輯]我是從經驗來說的,作爲WebSync的作者之一。