function* foo() {
yield 123
};
// - - -
function* foo() {
return yield 123
};
私は2つの違いを説明できないようです。JS Generators: `return yield 'と` yield'はどう違うのですか?
- 明らかな違いはありますか?
- 発電機に
return
を使用する必要がありますか?
function* foo() {
yield 123
};
// - - -
function* foo() {
return yield 123
};
私は2つの違いを説明できないようです。JS Generators: `return yield 'と` yield'はどう違うのですか?
return
を使用する必要がありますか?まず、ジェネレータはやや複雑なトピックなので、ここでは完全な概要を説明することはできません。詳細については、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
の動作が得られます。
これが役立つことを願っています!
違いは、前回の続き呼び出しの結果値である:
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
は非常に便利ではありません。
質問をいただきありがとうございます。多くの回答はJS Generatorsの詳細を知るのに役立ちます。 – yussan