SOURCE

function run(gen) {
	var args = [].slice.call( arguments, 1), it;
	it = gen.apply( this, args );
	return Promise.resolve()
		.then( function handleNext(value){
			var next = it.next( value );
			return (function handleResult(next){
				if (next.done) {
					return next.value;
				}
				else {
					return Promise.resolve( next.value )
						.then(
							handleNext,
							function handleErr(err) {
								return Promise.resolve(
									it.throw( err )
								)
								.then( handleResult );
							}
						);
				}
			})(next);
		} );
}

function request(url) {
    return new Promise(function(resolve){
        setTimeout(function(){
            resolve( url.match(/v=(\d+)$/)[1] );
        },1000);
    });
}

function *foo(val) {
    if (val > 1) {
        // generator recursion
        console.log( "response:", yield *foo( val - 1 ) );
    }

    return yield request( "http://some.url/?v=" + val );
}

function *bar() {
	var r1 = yield *foo( 3 );
	console.log( r1 );
}

run( bar );
console 命令行工具 X clear

                    
>
console