Promises
function r(delay){
return new Promise((resolve, reject) => {
setTimeout(function(){
return resolve({n:Math.round(Math.random(100) * 1000)});
}, delay);
});
}
var result = [];
Promise.all([r(1), r(2)])
.then(function(data) {
result = [{a},{b}] = data;
})
.then(function (data){
return Promise.race([r(3),r(4),r(5)]);
})
.then(function (data){
console.log([[{n:a},{n:b}],{n:c}] = [result,data]);
})