→
ジェネレーター関数(function* または古いジェネレーター関数)のを一時停止したり再開したりするために使用します。
rv | ジェネレーターの実行を再開する next() メソッドに渡したオプションの値を受け取ります。 |
---|---|
式 | 経由でジェネレーター関数が返す値を定義します。省略した場合、代わりに undefined が返されます。 |
yield キーワードは、ジェネレーター関数の実行を一時停止し、ジェネレーターの呼び出し元に yield キーワードに続く値を戻します。これは、return キーワードのジェネレーター版と考えることができます。
yield はそれを含むジェネレーター関数の中で直接しか呼び出すことしかできません。呼び出し先の関数やコールバックから呼び出すことはできません。
yield キーワードはジェネレーターの next() メソッドを呼び出させ、value と done の2つのプロパティを持つ IteratorResult オブジェクトを返します。value プロパティは yield 式の評価結果であり、done は false、すなわちジェネレーター関数が完全には完了していないことを示します。
yield 式によって実行が停止されると、ジェネレーターの next() メソッドが呼び出されるまで、ジェネレーターのコード実行は一時停止します。ジェネレーターの next() メソッドが呼ばれるたびに、ジェネレーターの実行が再開され、次のうちのいずれかに達するまで実行されます。
ジェネレーターの next() メソッドにオプションの値が渡された場合、その値はジェネレーターの現在の yield 操作の返値となります。
ジェネレーターのコード パス、yield 演算子、新しい開始値を Generator.prototype.next() に渡すことで指定することができる機能により、ジェネレーターは大きな力と制御を提供します。
次のコードはジェネレーター関数の定義例です。
function* countAppleSales () { let saleList = [3, 7, 5] for (let i = 0; i < saleList.length; i++) { yield saleList[i] } }
上記のジェネレーター関数が定義されると、ご覧のようにイテレーターを構築するために使用されます。
let appleStore = countAppleSales(); //=[object Generator](Generatorオブジェクト) D=appleStore.next(); //={ value: 3, done: false } D=appleStore.next(); //={ value: 7, done: false } D=appleStore.next(); //={ value: 5, done: false } D=appleStore.next(); //={ value: undefined, done: true }