AJAX is an awesome tool. AJAX requests are usually faster than
regular page loads and allow for a wealth of dynamism within a page.
Unfortunately many people do not properly cache request information
when they can. Let me show you how I cache AJAX requests - it's super
easy!
My example will use my TwitterGitter plugin to grab a user's tweets.
Once we have the user's tweet information, we pull it from cache
instead of making a duplicate AJAX request.
The Javascript
//our cache object
var cache = {};
var formatTweets(info) {
//formats tweets, does whatever you want with the tweet information
};
//event
$('myForm').addEvent('submit',function() {
var handle = $('handle').value; //davidwalshblog, for example
var cacheHandle = handle.toLowerCase();
if(cache[cacheHandle]) {
formatTweets(cache[cacheHandle]);
}
else {
//gitter
var myTwitterGitter = new TwitterGitter(handle,{
count: 10,
onComplete: function(tweets,user) {
cache[cacheHandle] = tweets;
formatTweets(tweets);
}
}).retrieve();
}
});
Note that before we make the AJAX request, we check the cache object
to see if we've saved this key's (the key, in this case, is the
username because it is unique) information. If so, avoid the repetitive
AJAX request and simply return the cached information. If the key does
not exist, make the AJAX request and save the result to the cache.
Take a look at this flow:
- User requests "davidwalshblog" tweets. @davidwalshblog tweets don't exist in cache, so we go grab them from Twitter and store them in cache.
- User requests "mootools" tweets. @mootools tweets don't exist in cache, so we go grab them from Twitter and store them in cache.
- User requests "davidwalshblog" tweets again. @davidwalshblog tweets DO exist in cache, so we retrieve them from cache and avoid the ajax request.
Clearing the cache periodically is easy too!
(function() { cache = {}; }).periodical(1000 * 60 * 10); //10 minutes
Caching your AJAX results in a javascript object is a very simple
system to implement and can save you many repetitive requests.
Efficiency FTW!
|