2017-02-17 10 views

答えて

10

まず、ジェネレータはやや複雑なトピックなので、ここでは完全な概要を説明することはできません。詳細については、Kyle SimpsonのYou Don't Know JSシリーズをお勧めします。第5巻(Async &パフォーマンス)では、発電機の機能に関する優れた議論が行われています。

あなたが与えた特定の例に!

まず、あなたは一例で書いたコードは、それが正しく実行されますのみ場合違いはありませんが、が表示されます。ここに例があります:

function* foo() { 
    yield 123; 
} 

function* bar() { 
    return yield 123; 
} 

var f = foo(); 
var b = bar(); 

f.next(); // {value: 123, done: false} 
f.next(); // {value: undefined, done: true} 
b.next(); // {value: 123, done: false} 
b.next(); // {value: undefined, done: true} 

ご覧のとおり、私はジェネレータを通常の関数のように呼びません。ジェネレータ自体はジェネレータオブジェクト(イテレータの形式)を返します。そのイテレータを変数に格納し、.next()関数を使用してイテレータを次のステップ(yieldまたはreturnキーワード)に進めます。

キーワードyieldを使用すると、ジェネレータに値を渡すことができます。ここでは、例が異なる方法で実行されます。ここではそれがどのように見えるかです:

function* foo() { 
    yield 123; 
} 

function* bar() { 
    return yield 123; 
} 

var f = foo(); 
var b = bar(); 

// Start the generator and advance to the first `yield` 
f.next(); // {value: 123, done: false} 
b.next(); // {value: 123, done: false} 

/** Now that I'm at a `yield` statement I can pass a value into the `yield` 
* keyword. There aren't any more `yield` statements in either function, 
* so .next() will look for a return statement or return undefined if one 
* doesn't exist. Like so: 
*/ 
f.next(2); // {value: undefined, done: true} 
b.next(2); // {value: 2, done: true} 

bar()は数2を返すのに対しfoo()は、値としてundefinedを返すことに注意してください、我々は.next()呼び出しに渡している値はreturnキーワードに送信されるためです戻り値として設定します。 foo()には明示的なreturn文がないため、デフォルトのundefinedの動作が得られます。

これが役立つことを願っています!

6

違いは、前回の続き呼び出しの結果値である:

function* fooA() { 
    yield 123 
}; 
var a = fooA(); 
console.log(a.next(1)); // {done:false, value:123} 
console.log(a.next(2)); // {done:true, value:undefined} 

function* fooB() { 
    return 40 + (yield 123) 
}; 
var b = fooB(); 
console.log(b.next(1)); // {done:false, value:123} 
console.log(b.next(2)); // {done:true, value:42} 
return値を必要としない

ほとんどの発電機、彼らの目的は、副作用としての価値ストリームの生成時に、彼ら走っている。すべてのイテレータはこの種のもので、for ofループで実行された場合、結果は終了を示していますが、値は破棄されます。

しかし、結果値が重要なジェネレータもあります。非同期プロセス(async/await promic構文のpolyfill、またはCSPのような多くのもの)を記述するためのツールとして使用されています。 iterableでyield*を使用すると、returnのed値も得られます。

いずれにしても、return yieldは非常に便利ではありません。

関連する問題