如何缓冲Ajax请求?

时间:2009-04-16 08:48:24

标签: php javascript ajax

我有一个简单的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()。

3 个答案:

答案 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 =服务器)

  • C发送请求
  • S准备整个输出
  • S生成某种数据标识符密钥(例如,数据的md5)
  • S将数据切割成块并保存(并确定块数)
  • S返回数据标识符(可能是块数)
  • C从第一个块重复到最后一个,向服务器发送数据密钥(和块号)
  • S返回请求的块
  • C显示块(或内容正在加载进度条)

需要注意的是,如果你不进入进度条方式而是进行instand处理,那么S必须将数据切割成块,作为C可处理的部分正确代码片段。