O cache é uma abordagem muito comum no lado do servidor, mas não tão bem explorada no lado do cliente (sem falar sobre a rede ou o cache nativo do navegador aqui …)
Portanto, uma abordagem muito comum tornou-se para solicitações de cache, para que você não faça isso duas vezes, você pode até mesmo encontrá-la na página de exemplos jQuery:
var cachedScriptPromises = {};
$.cachedGetScript = function( url, callback ) {
if ( !cachedScriptPromises[ url ] ) {
cachedScriptPromises[ url ] = $.Deferred(function( defer ) {
$.getScript( url ).then( defer.resolve, defer.reject );
}).promise();
}
return cachedScriptPromises[ url ].done( callback );
};
É …. ok … mas não dá a você nenhum controle sobre expiração, invalidação ou persistência.
Com essa ideia em mente, eu escrevo uma biblioteca de cache baseada em Promise chamada stash.js (após a biblioteca php ), que permite que você faça algumas coisas como:
// reload the feed every 15 minutes
function getFeed() {
return stash.get('feed').catch(function () {
// cache not available
return actuallyReachServer().then(function (serverData) {
this.set(serverData, 15 * 60);
return serverData;
});
});
}
E depois:
getFeed().then(function (feedData) {
document.querySelector('.feed').innerHTML = feedData;
}).done();
E é claro que você poderia usar exatamente a mesma abordagem no servidor (mas alcançando o banco de dados em vez do servidor …).
Até agora, o Stash tem 4 drivers: Ephemeral
(cache na memória) LocalStorage
, Redis
e Memcached
. Também é multicamadas, você pode usar qualquer combinação de drivers em qualquer ordem que desejar para ler de cima para baixo e escrever de baixo para cima. (O driver IndexedDB já está a caminho …)
Stash também vem com estratégias 4 de invalidação: NONE
, OLD
, PRECOMPUTE
e VALUE
.
Se você estiver interessado, há uma demonstração ao vivo muito simples que consome a API do Facebook disponível aqui e você pode encontrar ainda mais na página do github do projeto