Caching http requests with Angular


AngularJs provides caching in form of $cacheFactory. $cacheFactory is basically an in memory javascript dictionary.

Angular cache module is a better replacement of $cacheFactory. Angular cache module allows to use SessionStorage or LocalStorage for persistent cache.

One of the advantages of Angular cache is

The downside of letting $http handle caching for you is that it caches the responses (in string form) to your requests–not the JavaScript Object parsed from the response body. This means you can’t interact with the data in the cache used by $http. See below for how to handle the caching yourself, which gives you more control and the ability to interact with the cache (use it as a data store).

For example, I create a cache called messageCache

if(!CacheFactory.get('messageCache'))
{
	CacheFactory.createCache('messageCache', {
				              deleteOnExpire: 'aggressive',
				              recycleFreq: 60000
				             });
}

var messageCache = CacheFactory.get('messageCache');

And then use it in one of my service’s http methods:

function getUserMessagesByCompany(userId, companyId, showLoader) {
	var userMessages;
						
						
	userMessages = $http.get('/api/mobile/chat/getusermessagesbycompany/'
				   + userId + '/' + companyId + '.json', {ignoreLoadingBar : showLoader, cache: messageCache});
					
							
	return userMessages;

}

In this case, messageCache is our cache store and it stores the cache in form of key value pair where keys are simply the Url’s to the get requests.

Now, how do we modify the data cached for a particular request. Its simple if we understand how the cache is stored for a particular key.

The cache value is simple an array of length 4, where the first index contains the response in stringified form. In our case, the response was in the form of this json structure

{
	"userMessages": 
	[
			{  }, {  } 
	]
}

Now suppose we want to insert a new message in this response inside our cache

function insertMessageIntoCache(userId, companyId, newMessage)
{
	var key = '/api/mobile/chat/getusermessagesbycompany/' + userId + '/' + companyId +'.json';
	
	if(messageCache)
		{
				// Get the response object
				var messagesResponse = messageCache.get(key);
				
				// Get the HTTP response in string form
				var messagesArrayString = messagesResponse[1];
				
				// Parse it into JSON
				var messagesArrayJSON = JSON.parse(messagesArrayString);
				
				// Insert a new message 
				messagesArrayJSON.userMessages.unshift(newMessage);
				
				// Convert the response back into string
				messagesResponse[1] = JSON.stringify(messagesArrayJSON);
				
				// replace the cache key
				messageCache.put(key, messagesResponse);
		
		}
	
}