2009-12-17 5 views
1

Je cherche à mettre en place un bon moyen de mettre en cache les résultats des requêtes AJAX afin que le même utilisateur n'ait pas à répéter deux fois la même requête sur la même page. J'ai mis quelque chose en utilisant un Hash qui fonctionne bien mais je ne suis pas sûr s'il y a une meilleure méthode que je pourrais utiliser. Ceci est un extrait approximatif de ce que je suis venu avec ce qui devrait vous donner une idée générale:Mise en cache des résultats de requête AJAX avec le prototype

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

Répondre

3

Si vous commencez à créer un arbre de résultats avec JSON, vous pouvez vérifier qu'une branche particulière (ou une entrée) existe dans l'arborescence. Si ce n'est pas le cas, vous pouvez aller le chercher sur le serveur. Vous pouvez ensuite sérialiser vos données JSON et les stocker dans window.name. Vous pouvez ensuite conserver les données de page en page.

Edit:

Voici un moyen simple d'utiliser JSON pour ce type de tâche:

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") 
} 
+0

probablement pas besoin de persistance de la page dans ce cas, pouvez-vous donner des exemples/liens vers ce que vous entendez par arbre de résultats json? – robjmills

+0

J'ai ajouté un exemple à ma réponse. –

+0

merci pour l'info – robjmills

1

Eh bien, je suppose que vous pourriez abstraire un peu plus (par exemple, étendre Ajax par une méthode cachedRequest() qui hash une combinaison de tous les paramètres pour le rendre universellement utilisable dans n'importe quelle requête Ajax) mais l'approche générale me semble bien, et je ne peux pas penser à une solution meilleure/plus rapide.

4

Avez-vous essayé de mettre en cache les requêtes AJAX en définissant les en-têtes de contenu de cache. C'est un autre moyen et votre navigateur s'occupera de la mise en cache. Vous n'avez pas besoin de créer de hachage à l'intérieur de votre libraray pour conserver les données du cache.

High performance websites discuté beaucoup à ce sujet. Je ne sais pas grand-chose sur le PHP, mais il y a un moyen .Net dans le monde pour définir les en-têtes de cache avant d'écrire la réponse à stream. Je suis sûr qu'il devrait y avoir une manière similaire en PHP aussi.

+0

Vraisemblablement une requête HTTP est toujours fait bien avec cette méthode? – robjmills

Questions connexes