帮我解决这个例子:

function* genFuncWithReturn() {
    yield 'a';
    yield 'b';
    return 'The result';
}
function* logReturned(genObj) {
    const result = yield* genObj;
    console.log(result); // (A)
}


结果是:

> [...logReturned(genFuncWithReturn())]
The result
[ 'a', 'b' ]


因此,我的问题是为什么为什么首先生成return语句,然后又生成递归生成器语句?

最佳答案

[...logReturned(...)]终止后,logReturned会生成一个新数组。在logReturned终止之前,它将调用console.log(result)

也许这种ASCII艺术有助于理解流程:

┌──────────────────────┐     ┌──────────────────────┐      ┌─────────────────────┐
│[...logReturned(...)] │     │     logReturned      │      │  genFuncWithReturn  │
└──────────────────────┘     └──────────────────────┘      └─────────────────────┘
            │                            │                            │
            │                            │                            │
            │   get next from iterator   │                            │
            │ ─────────────────────────▶ │   get next from iterator   │
            │                            │ ─────────────────────────▶ │
            │                            │                            │
            │                            │         yield 'a'          │
            │          yield 'a'         │ ◀───────────────────────── │
            │ ◀───────────────────────── │                            │
            │                            │                            │
     (remembers 'a')                     │                            │
            │                            │                            │
            │    get next from iterator  │                            │
            │ ─────────────────────────▶ │   get next from iterator   │
            │                            │ ─────────────────────────▶ │
            │                            │                            │
            │                            │         yield 'b'          │
            │          yield 'b'         │ ◀───────────────────────── │
            │ ◀───────────────────────── │                            │
            │                            │                            │
     (remembers 'b')                     │                            │
            │                            │                            │
            │  get next from iterator    │                            │
            │ ─────────────────────────▶ │   get next from iterator   │
            │                            │ ─────────────────────────▶ │
            │                            │                            │
            │                            │  done, return 'The result' │
            │                            │ ◀───────────────────────── │
            │                            │                            │
            │                    console.log(result)             (terminates)
            │                            │
            │            done            │
   return   │ ◀───────────────────────── │
 ['a', 'b'] │                            │
◀───────────│                      (terminates)
            │

07-24 14:44