帮我解决这个例子:
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)
│