Edit in JSFiddle

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