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);