[英]Accessing partial response using AJAX or WebSockets?
我正在使用一些客戶端JavaScript代碼通過HTTP GET從Web服務器中提取大量JSON數據。 數據量可能很大,比如50 MB。 這是在局域網上,所以這不是一個問題,但它仍然需要十秒鍾左右。
為了使我的界面更具響應性,我想以塊的形式處理響應,一旦可用就顯示UI中的數據(比方說,每MB或每秒)。 瀏覽器兼容性不是問題; 只要它適用於最新的Chrome和Firefox,它就沒問題。 但是,我無法修改服務器代碼。
是否可以使用XMLHttpRequest或WebSockets或其他一些我沒有聽說過的技術來做到這一點?
當狀態為LOADING
時, XMLHttpRequest.responseText
未顯式為空:
responseText屬性必須返回運行這些步驟的結果:
- 如果狀態不是LOADING或DONE返回空字符串並終止這些步驟。
- 返回文本響應實體主體。
但是我認為緩沖會在整個過程中的各個階段發生,所以如果我設置一個定時器來定期輪詢responseText
,它會起作用嗎?
據我所知,WebSockets也需要服務器端的特殊協議,所以這些協議已經完成。
限制:我無法修改服務器代碼。
想發布這個評論,但評論textarea有點限制
服務器此刻是以塊的形式發送數據還是連續流? 如果你在xmlHttpRequestInstance.onreadystatechange
添加一個處理程序,它的觸發頻率是多少? 如果xmlHttpRequestInstance.readystate
的值為3,那么您可以獲取xmlHttpRequestInstance.responseText
的當前值並跟蹤長度。 下次readystate更改時,您可以通過從該點開始獲取所有新數據來獲取最新數據。
我沒有測試過以下內容,但希望它足夠清楚:
var xhr = new XMLHttpRequest();
var lastPos = 0;
xhr.onreadystatechange = function() {
if(xhr.readystate === 3) {
var data = xhr.responseText.substring(lastPos);
lastPos = xhr.responseText.length;
process(data);
}
};
// then of course do `open` and `send` :)
這當然依賴於onreadystatechange
事件觸發。 這適用於IE,Chrome,Safari和Firefox。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.