function *program() { var {moe, larry, curly} = yield { moe: getUserAsync('Moe'), larry: getUserAsync('Larry'), curly: getUserAsync('Curly') }; log(moe); log(larry); log(curly); var me = yield getUserAsync('Me'); log(me) } run(program()); function log(arg) { $('<div>').text(JSON.stringify(arg)).appendTo('body') } function run(gen) { step(); function step(value) { var result = gen.next(value); if (result.value instanceof Promise) { result.value.then(step); } else if (typeof result.value === 'object') { Promise.props(result.value).then(step); } else if (!result.done) { step(result.value); } } } function getUserAsync(name) { return new Promise(function(res) { log('Starting mock get') setTimeout(function() { res({name:name, age: ~~(Math.random() * 50)}); }, 1000); }); }