2017-11-19 10 views
2

ジェネレータで "return"のセマンティクスを理解することに問題があります。私はそれを最終的な、それ故に最後の価値として理解した。ジェネレータの戻り値のセマンティクス

function* gen() { 
    yield "foo"; 
    return "bar"; 
} 

for (const x of gen()) { 
    console.log(x); 
} 

この例では、「bar」ではなく「foo」のみが表示されます。

EDIT:

は、構文「のために」と「真=済」イテレータの戻り値を取得する方法はありますか、それは常に迷子のでしょうか?

答えて

1

についての詳細はありません、あなたがfor … ofループからの戻り値を取得することはできませんしたい.IFそれはforbarを印刷します。しかし、試すことができます

function* gen() { 
    yield 1; 
    yield 2; 
    return "done"; 
} 
function* genAndLogResult() { 
    const val = yield* gen(); 
    console.log(val); 
} 

for (const x of genAndLogResult()) { 
    console.log(x + 40); 
} 
+0

'yield yield * gen()'を実行できませんでしたか? –

+0

@ JonasW。 1つは可能ですが、私はそれをお勧めしません。戻り値は、通常、返される値とは大きく異なります。コレクションの一部ではありません。 'gen'の作者がそこに置かなかった場合、彼はおそらくそれには正当な理由があったでしょう。より良い例で答えを更新しました。 – Bergi

+0

これは適切なプログラミングだとは思わない...これはちょうどハックです。適切な言語のアルゴリズムでこれを必要とすべきではありません。 – Redu

0

から:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function%2A

発電でreturn文は、実行されると、発電機が行わようになります。値が返された場合は、値として返されます。返されたジェネレータはそれ以上の値を生成しません。

forループが「done」ステップをスキップすることは意味があります。例:発電機は必ずしもreturn声明を持っていないので

function* gen() { yield "foo" } 
const inst = gen() 
inst.next() // { done: false, value: "foo" } 
inst.next() // { done: true, value: undefined } 

function* gen() { yield "foo"; return "bar" } 
const inst = gen() 
inst.next() // { done: false, value: "foo" } 
inst.next() // { done: true, value: "bar" } 

は、あなたがforループの最後の反復は常に最終undefined値に対処する必要がありますする必要はありません。

+0

十分なフェア!あなたはおそらく編集に答えることができますか? – user3612643

+0

ちょうど書式変更だった – chautelly

0

yieldキーワードは、ジェネレータ機能の一時停止と再開に使用されます。

function* gen() { yield "foo"; yield "bar"; }
for (const x of gen()) { console.log(x); }

あなたはyieldクリックhere