2012-05-01 2 views
5

Я хотел бы кэшировать данные, полученные с сервера, чтобы было выполнено минимальное количество инструкций PHP/MySQL. Я знаю, что параметр кеша автоматически устанавливается для $ .ajax(). Тем не менее, я вижу инструкции MySQL каждый раз, когда вызывается $ .ajax(), даже если postdata такая же, как и в предыдущем вызове. Я что-то упускаю? Каков наилучший способ кэширования данных, полученных с сервера? Вот мой код:Как кэшировать данные, полученные от вызова 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); 
    } 
}); 

ответ

4

Вот эта идея. Разумеется, настройте его на свои нужды.

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(); 
+0

Причина для downvote? Был ли этот ответ не полезным? – AlienWebguy

+0

Браузер обрабатывает кеширование, если вы его разрешаете. Если он пытается дважды сделать ТОЧНЫЙ тот же запрос, он просто использует собственный кеш. Зачем изобретать колесо, когда браузер обрабатывает кеширование для вас? – Adam

+0

Не уверен, мне кажется хорошей идеей. Сохраняя его на элементе, он автоматически очищается, когда элемент удаляется jQuery. –

0

Вы должны добавить параметр кэша, как:

$.ajax({ 
... 
... 
cache : true 
}); 
+0

По умолчанию параметр кеша является истинным. Чтобы быть уверенным, я поставил его так, как вы предлагали. Я все еще вижу инструкции MySQL, обрабатываемые сервером. – Stephen305

4

Я бы обрабатывать кэш сам:

// 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'); 
    } 
}); 

Таким образом, если запрос с указанным id уже произошел, новый запрос не будет выполнен, если вы не удалите его из кеша.

+0

Ницца. Это также будет работать. – Stephen305

+0

, но будет ли вызываться метод отложенного.done() при возврате кэшированных данных? – sivann

+0

называется no, но вы можете подключить к нему больше обратных вызовов, и обратные вызовы будут немедленно срабатывать, потому что они уже разрешены. –

Смежные вопросы