2012-05-01 58 views
5

我想緩存從服務器接收的數據,以便執行最少數量的PHP/MySQL指令。我知道緩存選項是自動爲$ .ajax()設置的。但是,即使postdata與之前的調用相同,我也會在每次調用$ .ajax()時看到MySQL指令。我錯過了什麼嗎?緩存從服務器接收的數據的最佳方式是什麼?這裏是我的代碼:如何緩存從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

如果您願意,瀏覽器會自行處理緩存。如果它試圖使兩次EXACT相同的請求,它只是使用它自己的緩存。爲什麼在瀏覽器爲你處理緩存時重新發明輪子? – Adam

+0

不知道,對我來說這似乎是一個很好的概念。通過將其存儲在元素上,當元素被jQuery刪除時,它會自動清理。 –

0

您必須添加一個緩存參數,如:

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

默認情況下,緩存參數爲true。可以肯定的是,我按照你的建議設定了它。我仍然看到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

,但是在返回緩存數據時會再次調用deferred.done()方法嗎? – sivann

+0

叫,不,但你可以附加更多的回調,回調將立即觸發,因爲它已經解決。 –