Better Promise.all
by Derek Leung
Babel + JSX
// Fake task
function genVal(val){
var randomInt = Math.random() * 2000 | 0;
return new Promise(res => setTimeout(() => {
console.log(`Value ${val} finished in ${randomInt}ms.`);
res(val)
}, randomInt));
}
// Better Promise.all that can store values in an object that gets
// passed down the promise chain.
function pack(){
var args = arguments;
if((args.length - 1) % 2 != 0){
throw "Invalid input";
}
var obj = args[0],
promises = [];
for(var i = 1; i < args.length; i+=2){
let promise = args[i],
name = args[i+1];
promises.push(promise.then(val => {
obj[name] = val;
}));
}
return Promise.all(promises).then(() => obj);
}
// Test case
Promise
.resolve({})
.then(obj => {
return pack(obj, genVal("a"), "a", genVal("b"), "b");
})
.then(obj => {
return pack(obj, genVal("c"), "c");
})
.then(console.log);