Jquery 如何缓存从Ajax调用接收的数据?
我希望缓存从服务器接收到的数据,以便执行最少数量的PHP/MySQL指令。我知道缓存选项是自动为$.ajax()设置的。但是,每次调用$.ajax()时,我都会看到MySQL指令,即使postdata与前一次调用中的相同。我错过什么了吗?缓存从服务器接收的数据的最佳方式是什么?这是我的密码:Jquery 如何缓存从Ajax调用接收的数据?,jquery,ajax,caching,Jquery,Ajax,Caching,我希望缓存从服务器接收到的数据,以便执行最少数量的PHP/MySQL指令。我知道缓存选项是自动为$.ajax()设置的。但是,每次调用$.ajax()时,我都会看到MySQL指令,即使postdata与前一次调用中的相同。我错过什么了吗?缓存从服务器接收的数据的最佳方式是什么?这是我的密码: var postdata = {'pid':'<?php echo $project_id;?>', 'record_id':this.id}; $.ajax(
var postdata = {'pid':'<?php echo $project_id;?>',
'record_id':this.id};
$.ajax({
type: "POST",
url: "get_note.php",
data: postdata
}).done(function(data){
if (data != '0') {
// Add dialog content
$('#note_container').html(data);
$('#note_container').dialog();
} else {
alert(woops);
}
});
var postdata={'pid':'',
'record_id':this.id};
$.ajax({
类型:“POST”,
url:“get_note.php”,
数据:postdata
}).完成(功能(数据){
如果(数据!=“0”){
//添加对话框内容
$('note#u container').html(数据);
$('note#u container')。dialog();
}否则{
警报(woops);
}
});
您必须添加一个缓存参数,如:
$.ajax({
...
...
cache : true
});
我会自己处理缓存:
// declare this on global scope
var ajaxCache = {};
...
if (!ajaxCache[this.id]) {
ajaxCache[this.id] = $.ajax({
type: "POST",
url: "get_note.php",
data: {'pid':'<?php echo $project_id;?>','record_id':this.id}
});
}
ajaxCache[this.id].done(function(){
if (data != '0') {
// Add dialog content
$('#note_container').html(data);
$('#note_container').dialog();
} else {
alert('woops');
}
});
//在全局范围中声明此
var ajaxCache={};
...
如果(!ajaxCache[this.id]){
ajaxCache[this.id]=$.ajax({
类型:“POST”,
url:“get_note.php”,
数据:{'pid':'','record_id':this.id}
});
}
ajaxCache[this.id].done(函数(){
如果(数据!=“0”){
//添加对话框内容
$('note#u container').html(数据);
$('note#u container')。dialog();
}否则{
警报(“呜呜声”);
}
});
这样,如果已发生具有所述id的请求,则除非您将其从缓存中删除,否则不会发出新请求。这是一个想法。当然,根据你的需要调整一下
function getAjaxData(){
var $node = $('#note_container');
if ($node.data('ajax-cache').length == 0) {
$.ajax({
// do stuff.
success: function(data){
// Add dialog content
$node.html(data).data('ajax-cache',data).dialog();
}
});
} else {
$node.html( $node.data('ajax-cache') ).dialog();
}
}
getAjaxData();
如果您允许,浏览器将自行处理缓存。如果它尝试两次发出完全相同的请求,它只会使用自己的缓存。当浏览器为您处理缓存时,为什么要重新发明轮子?不确定,对我来说似乎是个好概念。通过将其存储在元素上,当jQuery删除元素时,它会自动被清除。@ajax请求的Adam缓存可能不一致(正如Civil777所看到的),使其一致的一种方法是自己处理它。默认情况下,cache参数为true。为了确定,我按照你的建议设置了。我仍然看到服务器正在处理MySQL指令。但是返回缓存数据时是否会再次调用deferred.done()方法?已调用,否,但您可以附加更多回调,回调将立即触发,因为它已被解析。看起来
data
变量在.done()中未定义
回调