ジェネレータとサブジェネレータの実行順序を詳細に説明します.
1769 ワード
ダウンジェネレータとサブジェネレータの時に正直に言ってくるくるとしていましたが、今はやっと分かりました.この簡単な記録で忘れないようにします.
簡単なコードは以下の通りです.
一つのローズマリーdを定義して、「値が入ってきたw」に伝えます.ここでジェネレータ内部では何もできません.ただwの値を賦課しています.
consolie.log(d.next()
ディケンサを実行して返した値を印刷します.このときは、質問関数が実行を開始することが理解できますが、ジェネレータであるため、yieldキーワードプログラムが保留されます.つまり、yieldキーワードの後の文を実行したら、プログラムは次のnextを待っています.ここで文let c=yield fn()に留まりました.ここです.fnは実行され、プログラムは保留され、cは割当状態を待つ.
yield fn()はnextに返す値は以下の通りです.
consolie.log(d.next(next着信値);
ローズマリーを実行して、戻った値を印刷します.ローズマリーを掛けられた部分は再度nextを受け取ります.プログラムは続けて実行します.cは値が割り当てられています.ここで注意したいのですが、yieldの戻り値はyield関数の戻り値と無関係です.つまり、fnの戻り値はyieldに戻り値としてcに返されません.本当にcに戻ります.fnの戻り値はyieldによってnextに返されました.ここでcの値はnextが入ってきた値です. nextの値は:
consolie.log(d.next();
同じ原理で降りていくと、プログラムにはキーワードがないので、nextに戻ります.
コンソールに印刷します.
簡単なコードは以下の通りです.
let fn = () => {
console.log('fn ');
return 'fn return '
}
function* Ifn(w) {
console.log('Ifn w:', w)
let c = yield fn();
console.log('c :', c);
yield ('a' + c);
};
let d = Ifn(' w');
console.log(d.next());
console.log(d.next('next '));
console.log(d.next());
let d=Ifn('伝来のw')一つのローズマリーdを定義して、「値が入ってきたw」に伝えます.ここでジェネレータ内部では何もできません.ただwの値を賦課しています.
consolie.log(d.next()
ディケンサを実行して返した値を印刷します.このときは、質問関数が実行を開始することが理解できますが、ジェネレータであるため、yieldキーワードプログラムが保留されます.つまり、yieldキーワードの後の文を実行したら、プログラムは次のnextを待っています.ここで文let c=yield fn()に留まりました.ここです.fnは実行され、プログラムは保留され、cは割当状態を待つ.
yield fn()はnextに返す値は以下の通りです.
{value:'fn return ',done:false}
ここで、valueの値はfn()によって決まります.この関数が戻り値がない場合はundefinedに戻り、また戻ったら戻り値を取ります.doneは最後のyieldキーワードかどうか(反復が終了するかどうか)を簡単に理解できます.もしyieldの後ろに直接変数があるなら、そのままその変数をvalue値として取ります. consolie.log(d.next(next着信値);
ローズマリーを実行して、戻った値を印刷します.ローズマリーを掛けられた部分は再度nextを受け取ります.プログラムは続けて実行します.cは値が割り当てられています.ここで注意したいのですが、yieldの戻り値はyield関数の戻り値と無関係です.つまり、fnの戻り値はyieldに戻り値としてcに返されません.本当にcに戻ります.fnの戻り値はyieldによってnextに返されました.ここでcの値はnextが入ってきた値です. nextの値は:
{value: "anext ", done: false}
consolie.log(d.next();
同じ原理で降りていくと、プログラムにはキーワードがないので、nextに戻ります.
{value:undefined,done:true}
コンソールに印刷します.
1、Ifn w: w
2、fn
3、{value: "fn return ", done: false}
4、c : next
5、{value: "anext ", done: false}
6、{value: undefined, done: true}