ジェネレータとサブジェネレータの実行順序を詳細に説明します.


ダウンジェネレータとサブジェネレータの時に正直に言ってくるくるとしていましたが、今はやっと分かりました.この簡単な記録で忘れないようにします.
簡単なコードは以下の通りです.
    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}