2017-08-15 1 views
5

私はgenerator functions on MDNにつまずいたとものを私に困惑することは、次の例です:なぜjavascriptジェネレータ関数のyield文が.next()のパラメータを返すのですか?

function* logGenerator() { 
    console.log(yield); 
    console.log(yield); 
    console.log(yield); 
} 

var gen = logGenerator(); 

// the first call of next executes from the start of the function 
// until the first yield statement 
gen.next(); 
gen.next('pretzel'); // pretzel 
gen.next('california'); // california 
gen.next('mayonnaise'); // mayonnaise 

console.logの引数であるyield文は発電機の.next()メソッドに渡されたパラメータを返し、なぜ私が理解していないことです。これは空のyield.next()メソッドの最初のパラメータの値を返す必要があるためですか?

gen.next(1,2,3); // the printed value is 1, the 2 and 3 are ignored 
// and the actual yielded value is undefined 

またジェネレータ関数の本体内.next()方法の他のパラメータにアクセスする方法があります:

は、私はまたのような上記のステートメントを確認するように見えるいくつかのより多くの例を、試してみましたか?

yield文がこれらの値をconsole.logに戻しているのに対し、実際にはジェネレータの出力として出力されませんでした。私はそれが非常に混乱していると言う必要があります。

+0

...これは起こりそうなことなので、なぜこれがあなたを混乱させるのですか? – user2357112

+0

これは、 'yield'式が評価するものです。 – user2357112

+0

@ user2357112私は上記のコードで参照されるパラメータが表示されないので、混乱します。答えからリンクを読んだら、それはすべて意味をなさないが、最初にそれを見たとき、私はそれを理解しなかった。副次的なこととして、 'function * x(){yield yield yield;}'のようなこともできます。 – Jakub

答えて

2

大きな質問です。私は.next()メソッドでMDNを読むことが最も役立つと思います。あなたはそれに接続されているvalueとブールで、gen.next(1)

自体がオブジェクトを返すnext()オペレータのようなものを言って、あなたはnext()経由で値を生成関数(すなわちyield 1)自体の中に渡したり渡したい値を定義することができますdoneを使用して、ジェネレータ関数全体が終了したかどうかを示します。そしてそれにアクセスする/それを渡す2つの方法がありますvalue

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Generator/next

0

This makes it quite clear:

[RV] =収量[式]。

イテレータプロトコルを介してジェネレータ関数から返す値を定義します。省略した場合は、代わりにundefinedが返されます。

rvジェネレータのnext()メソッドに渡され、実行を再開するオプションの値を返します。

基本的には、送信したパラメータを印刷して実行を継続します。

1

混乱は、彼らが実際には同じことを行うながらyieldnextは、異なる構文を持っているという事実から来ています。 Generatorとその呼び出し元は対称です(そのため、 "co"ルールと呼ばれ、 "sub"ルールではありません)。両方の機能は、通信チャネルによって接続されていると考えることができ、そのジョブを実行するか、またはチャネル内の着信メッセージを待ってスリープすることができます。唯一の違いは、発信者が最初に目を覚ましている間に、発電機が最初に眠っていることです(つまり、その上に暗黙の「聞き取り」コマンドがあります)。

両方yieldnext三つの同じものです:

  • が眠って
  • 秋チャンネルに引数を書き込み、受信メッセージ
  • をリッスンはその値として、着信メッセージを発します目を覚ます(つまり、それらの下にあるものを持ち歩く)

イラスト:

_ = console.log.bind(console) 
 

 
function *gen() { 
 
    _('gen: good morning') 
 

 
    _('gen: sending hi') 
 
    _('gen: zzz') 
 
    p = yield 'hi' 
 
    _('gen: awake! got', p) 
 

 
    _('gen: now sending fine') 
 
    _('gen: zzz') 
 
    p = yield 'fine' 
 
    _('gen: awake! got', p) // *** 
 
} 
 

 
function main() { 
 

 
    var g = gen() 
 

 
    _('main: sending knock knock') 
 
    _('main: zzz') 
 
    r = g.next('knock knock') 
 
    _('main: awake! got', r) 
 

 
    _('main: sending how r u') 
 
    _('main: zzz') 
 
    r = g.next('how r u') 
 
    _('main: awake! got', r) 
 
} 
 

 
main()

書き込みが読み取りの前に来ているので、発電機に送られた非常に最初のメッセージが失われることに注意してください。それはジェネレータの起動にのみ使用されます。また、発電機を睡眠状態にしたままにしておくと、***に達していないことにも注意してください。

関連する問題