我正在寻找一种缓存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);
}
});
}
}
答案 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请求中普遍可用)但是一般方法看起来很好,我想不出更好/更快的解决方案。