Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 如何缓存从Ajax调用接收的数据?_Jquery_Ajax_Caching - Fatal编程技术网

Jquery 如何缓存从Ajax调用接收的数据?

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(

我希望缓存从服务器接收到的数据,以便执行最少数量的PHP/MySQL指令。我知道缓存选项是自动为$.ajax()设置的。但是,每次调用$.ajax()时,我都会看到MySQL指令,即使postdata与前一次调用中的相同。我错过什么了吗?缓存从服务器接收的数据的最佳方式是什么?这是我的密码:

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()中未定义
回调