[英]How to buffering an Ajax Request?
我有一個簡單的 Ajax 函數,如下所示:
var x;
var myRequest = new Array();
function CreateXmlHttpReq(handler) {
var xmlhttp = null;
try {
xmlhttp = new XMLHttpRequest();
} catch (e) {
try {
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
}
xmlhttp.onreadystatechange = handler;
return xmlhttp;
}
function getResults() {
var r = Math.random();
var someVar = document.getElementById("myvar").value;
var myUrl = "url/of/my/phpScript.php?";
myUrl += "r=" + r;
//encodeURIComponent() instead of escape() when i aspect normal text
myUrl += "&someVar=" + escape(someVar);
//startLoading just show an overlay with a small rotating gif
startLoading();
x++;
myRequest[x] = CreateXmlHttpReq(function () {
printResultHandler(x);
});
myRequest[x].open("GET", myUrl);
myRequest[x].send(null);
}
//example handler
function printResultHandler(x) {
if (myRequest[x].readyState == 4 && myRequest[x].status == 200) {
//usually i use innerHTML for quick requests, the DOM for more complex req
document.getElementById(div).innerHTML = myRequest[x].responseText;
//this will hide the overlay showed ith startLoading()
stopLoading();
}
}
這工作正常。 我只是在返回流量很大(可以是 XML、HTML 或其他任何內容)時遇到一些問題,瀏覽器似乎會“睡着”一段時間。 我不喜歡將大量文本(XML、HTML)合二為一。 處理這個不好。
我想知道是否存在某種方法來緩沖該請求。 當請求完成並返回200
狀態時,有沒有辦法逐個獲取 responseText(假設為 2048 字節或逐行)? 我想是這樣的:
function printResultHandler(x) {
if (myRequest[x].readyState == 4 && myRequest[x].status == 200) {
//usually i use innerHTML for quick requests, the DOM for more complex req
//document.getElementById(div).innerHTML = myRequest[x].responseText;
var answer;
while ((answer = readline(myRequest[x].responseText))) {
//to something;
}
//this will hide the overlay showed ith startLoading()
stopLoading();
}
}
簡而言之,相當於 PHP 的readdir()
或fread()
。
同意,緩沖請求並不是您真正可以做的事情。
您可以考慮通過一組 HTTP 請求錯開用戶對數據的請求,在每個 HTTP 請求返回時對其進行解析和處理。
例如,如果用戶希望請求記錄 1 到 1000,客戶端可以首先請求記錄 1 到 100,處理、解析和呈現它,然后請求記錄 101 到 200,依此類推。 前 100 條記錄會相對較快地顯示出來,過一小段時間后,接下來的 100 條記錄就會顯示出來。 只要在用戶設法處理前 100 條記錄之前顯示后 100 條記錄,就應該沒問題。 完成請求的總時間會更長,但 Web 應用程序的響應速度會更快,感知的任務完成時間會更短。
如果您不只是用數據更新元素的 innerHTML 屬性,您還應該考慮從 XML 切換到 JSON。
要向用戶顯示對 AJAX 請求的響應,必須首先將響應解析為數據結構,然后呈現。 令人驚訝的是,XML 和 JSON 的解析時間幾乎相同。 不同之處在於遍歷和讀取結果數據結構所需的時間。
用於遍歷和訪問已解析響應的 DOM 內數據的瀏覽器函數相對較慢。 瀏覽器 DOM API 方法掩蓋了 DOM 遍歷所涉及的復雜性,並使緩慢的過程看起來既美觀又簡單。
通過解析 JSON 格式的響應來訪問 JavaScript 對象中的數據要快得多。 對於相同的數據集,遍歷 JavaScript 對象比遍歷 DOM 樹快 2 到 3 倍。
在最近的測試中,我使用 10Mb 的源數據對 FireFox 3.1 beta 2 進行了測試,遍歷 XML 響應的 DOM 需要大約 30 秒。 對從相同的原始大數據集填充的 JavaScript 對象執行相同操作大約需要 15 秒。
不,沒有辦法緩沖請求。 如果您返回大量數據,然后嘗試將其一次性全部插入頁面,則解析所有數據總是需要很長時間。
您可能要考慮是否有另一種方法來獲得您想要的結果.. 是否有理由必須使用 AJAX 請求將如此大量的數據插入到頁面中?
您必須手動完成(也就是為自己編寫代碼)。
一個簡單的解決方案如下(C=client,S=server)
需要注意的是,如果您不采用進度條方式而是進行即時處理,那么 S 必須將數據切成塊作為部分正確的代碼片段,C 可以處理這些代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.