我有一个简单的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();
}
}
12345678901234567890123456789012345678901234567890123456789012345678901234567890
并且工作正常。当返回通量很大(可能是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()。
答案 0 :(得分:1)
同意,缓冲请求并不是你能做的事情。
您可以考虑在一组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秒。
答案 1 :(得分:0)
不,没有办法缓冲请求。如果您返回大量数据然后尝试将其全部插入到页面中,则所有要解析的数据总是需要很长时间。
您可能想要考虑是否有其他方法可以获得您想要的结果。是否有理由您必须使用AJAX请求将大量数据插入到页面中?
答案 2 :(得分:0)
你必须手动完成(也就是自己编码)。
以下是一个简单的解决方案(C =客户端,S =服务器)
需要注意的是,如果你不进入进度条方式而是进行instand处理,那么S必须将数据切割成块,作为C可处理的部分正确代码片段。