Edit in JSFiddle

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