Я читал книгу Кайла и наткнулся на этот код (Generator Runner), и я действительно пытался понять его полностью, но запутался в нескольких частях,
сначала: почему он инициализирует генератор в текущий контекст, что именно мы получаем из этого, я имею в виду, не можем ли мы просто инициализировать его нормально?
второй: при первом возврате, почему мы используем Promise.resolve (). заменяется на IIFE ?. потому что он использует IIFE при втором возврате.
function run(gen) {
var args = [].slice.call( arguments, 1), it;
// initialize the generator in the current context
it = gen.apply( this, args );
// return a promise for the generator completing
return Promise.resolve()
.then( function handleNext(value){
// run to the next yielded value
var next = it.next( value );
return (function handleResult(next){
// generator has completed running?
if (next.done) {
return next.value;
}
// otherwise keep going
else {
return Promise.resolve( next.value )
.then(
// resume the async loop on
// success, sending the resolved
// value back into the generator
handleNext,
// if `value` is a rejected
// promise, propagate error back
// into the generator for its own
// error handling
function handleErr(err) {
return Promise.resolve(
it.throw( err )
)
.then( handleResult );
}
);
}
})(next);
} );
}
Заранее спасибо