jsfiddle-console example
https://github.com/eu81273/jsfiddle-console
HTML
<script src="https://cdn.jsdelivr.net/gh/eu81273/jsfiddle-console/console.js"></script>
JavaScript
const _cacheValues = new Map();
const _cacheResolvedTime = new Map();
const _cachePromises = new Map();
const getDataCached = function (key) {
const now = new Date().getTime();
if (_cacheResolvedTime.has(key)) {
if ((now - _cacheResolvedTime.get(key)) > 60000) {
_cacheResolvedTime.delete(key);
_cacheValues.delete(key);
_cachePromises.delete(key);
}
}
if (_cacheValues.has(key)) {
return Promise.resolve(_cacheValues.get(key));
} else if (_cachePromises.has(key)) {
return _cachePromises.get(key);
} else {
const promise = new Promise(function (resolve, reject) {
return getData(key).then(data => {
_cacheValues.set(key, data);
_cachePromises.delete(key);
const now = new Date().getTime();
_cacheResolvedTime.set(key, now);
resolve(data);
});
});
_cachePromises.set(key, promise);
return promise;
}
};
function getData(key){
return new Promise(function(resolve, reject) {
console.log('starting get ' + key)
setTimeout(() => {
console.log('ending get ' + key)
resolve(key);
}, 1000);
})
}
getDataCached('a').then(result => { console.log('first call outer: ' + result);
getDataCached('a').then(result => { console.log('first call inner: ' + result); });
});
getDataCached('b').then(result => { console.log('first call outer: ' + result);
getDataCached('b').then(result => { console.log('first call inner: ' + result); });
});
getDataCached('a').then(result => { console.log('second call outer: ' + result);
getDataCached('a').then(result => { console.log('second call inner: ' + result); });
});
setTimeout(() => {
getDataCached('a').then(result => { console.log('later call outer: ' + result);
getDataCached('a').then(result => { console.log('later call inner: ' + result); });
});
}, 70000);