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