function *program() { var rand; rand = yield getRandAsync(); //async log(rand); rand = yield getRandSync(); //sync log(rand); rand = yield [getRandAsync(), getRandAsync(), getRandSync()]; //concurrent sync and async log(rand); } 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 (result.value instanceof Array) { Promise.all(result.value).then(step); } else if (!result.done) { step(result.value); } } } function getRandAsync() { return Promise.resolve(Math.random()); } function getRandSync() { return Math.random(); }