簡體   English   中英

使用AJAX或WebSockets訪問部分響應?

[英]Accessing partial response using AJAX or WebSockets?

我正在使用一些客戶端JavaScript代碼通過HTTP GET從Web服務器中提取大量JSON數據。 數據量可能很大,比如50 MB。 這是在局域網上,所以這不是一個問題,但它仍然需要十秒鍾左右。

為了使我的界面更具響應性,我想以塊的形式處理響應,一旦可用就顯示UI中的數據(比方說,每MB或每秒)。 瀏覽器兼容性不是問題; 只要它適用於最新的Chrome和Firefox,它就沒問題。 但是,我無法修改服務器代碼。

是否可以使用XMLHttpRequest或WebSockets或其他一些我沒有聽說過的技術來做到這一點?

當狀態為LOADING時, XMLHttpRequest.responseText未顯式為空:

responseText屬性必須返回運行這些步驟的結果:

  1. 如果狀態不是LOADING或DONE返回空字符串並終止這些步驟。
  2. 返回文本響應實體主體。

但是我認為緩沖會在整個過程中的各個階段發生,所以如果我設置一個定時器來定期輪詢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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM