使用原型缓存AJAX查询结果

时间:2009-12-17 12:11:50

标签: javascript caching prototypejs

我正在寻找一种缓存AJAX查询结果的好方法,以便同一用户不必在同一页面上重复相同的查询两次。我使用Hash将一些东西组合在一起工作正常,但我不确定是否有更好的方法可以使用。这是我提出的一个粗略的片段,它应该给你一个大致的想法:

var ajaxresults;

document.observe("dom:loaded", function() {
    ajaxresults = new Hash();
    doAjaxQuery();
});

function doAjaxQuery(){
    var qs = '?mode=getSomething&id='+$('something').value;
    if(ajaxresults.get(qs)){
        var vals = (ajaxresults.get(qs)).evalJSON();
        doSomething(vals);
    }else{
        new Ajax.Request('/ajaxfile.php'+qs,{
            evalJSON: true,
            onSuccess: function(transport){
                var vals = transport.responseText.evalJSON();
                ajaxresults.set(qs,transport.responseText);
            },
            onComplete: function(){
                doSomething(vals);
            }
        });
    }
}

3 个答案:

答案 0 :(得分:4)

您是否尝试通过定义缓存内容标头来缓存AJAX请求。它的另一种方式是你的浏览器将负责缓存。你不必在你的libraray中创建任何哈希来维护缓存数据。

High performance websites对此进行了很多讨论。我对PHP知之甚少,但在.Net世界中有一种方法可以在将响应写入流之前设置缓存头。我相信在PHP中也应该有类似的方式。

答案 1 :(得分:3)

如果您开始使用JSON构建结果树,则可以检查树中是否存在特定分支(或条目)。如果没有,你可以从服务器上获取它。

然后,您可以序列化JSON数据并将其存储在window.name中。然后,您也可以在页面之间保留数据。

编辑:

以下是将JSON用于此类任务的简单方法:

var clientData = {}
clientData.dataset1 = [
    {name:'Dave', age:'41', userid:2345},
    {name:'Vera', age:'32', userid:9856}
]

if(clientData.dataset2) {
    alert("dataset 2 loaded")
}
else {
    alert("dataset 2 must be loaded from server")
}

if(clientData.dataset1) {
    alert(clientData.dataset1[0].name)
}
else {
    alert("dataset 1 must be loaded from server")
}

答案 2 :(得分:1)

好吧,我想你可以抽象一些(例如,扩展Ajax一个cachedRequest()方法,它散列所有参数的组合,使其在任何Ajax请求中普遍可用)但是一般方法看起来很好,我想不出更好/更快的解决方案。