Promises cache example
by mbychawski
HTML
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.5.1/lodash.min.js"></script>
Babel + JSX
function get(resourceName){
let waitTime = _.random(0.5, 3, true) * 1000;
console.log('get(): request for', resourceName);
return new Promise((resolve)=>{
setTimeout(()=>{
console.log(`get(): resource ${resourceName} given after ${waitTime.toFixed(0)}ms`);
resolve( JSON.stringify({name: resourceName}) );
}, waitTime);
});
}
let load = (function(){
let _cache = {};
return function(names){
console.log('load(): request for:', names);
let promises = _.map(names, (name)=>{
if(!_.has(_cache, name)){
_cache[name] = get(name).then(JSON.parse);
}
return _cache[name];
});
return Promise.all(promises);
}
})();
Promise.all([
load(['res1', 'res2', 'res3']),
load(['res2', 'res3', 'res4', 'res5'])
])
.then(console.log.bind(console))
.then(()=>{
return load(['res2', 'res3', 'res4', 'res5', 'res6']);
})
.then(console.log.bind(console))
.catch(console.log.bind(console));