私はタイトルの第4章を読んでいます「あなたは知らないJS:ES6 &を越えて」 私はPromise.resolve(..)この静的関数にthenableまたは即値を渡すときに何が起こるかを知っています。 しかし、どのような場合、それはそのPromise.resolve(it.throw(err))
に行きますか?どのようPromise.resolve(it.throw(ERR))。その後、(handleResult)を理解するには?
のような約束+ジェネレータパタパタ示し全体コード: - 約束のチェーンがいっている場合function handleErr(err){..}
がどのように動作し、何が起こるでしょう
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);
});
}
私の主な問題は拒否ハンドラです。
'it'ジェネレータが' catch'ステートメントから 'yield'する場合です。確かに、 'return handleResult(it.throw(err))'だったはずです。そこに 'Promise.resolve' /' then'を置く必要はありません。 – Bergi
@Bergi - そこに置くことは絶対に重要です。それは意図的なものであり、間違いではありません。 'handleResult(it.throw(err)) 'を呼び出すと、今度はこのティックの間に呼び出されますが、私たちはそれを望んでいません。次のティックでそれを望みます。なぜなら、' Promise.resolve'でラップされ、 '.then'で次のティックに移動します。 –
@KyleSimpson:コルーチンはダニについて本当に気にしますか?しかし、たとえそれがあったとしても、handleResultに関係なく、ジェネレータを前進させる 'handleNext' /' handleErr'はどんな場合でも非同期に呼び出されます。 – Bergi