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