Generator は、終了して後で再入力することができる関数です。 JavaScript におけるジェネレータ (特に Promises と組み合わせた場合) は、コールバック地獄や Inversion of Control といったコールバックの問題を完全に排除できないまでも緩和するため、非同期プログラミングの非常に強力なツールになります。 しかし、これらの問題に対するさらに簡単な解決策は、非同期関数で達成できます。
ジェネレーター関数を呼び出すと、その本体がすぐに実行されるわけではなく、代わりにその関数のイテレーター オブジェクトが返されます。 イテレータの next()
メソッドが呼び出されると、イテレータから返す値を指定する最初の yield
式まで、または yield*
で別のジェネレータ関数に委ねるまで、ジェネレータ関数の本体が実行される。 next()
メソッドは、返された値を含むvalue
プロパティと、ジェネレータが最後の値を返したかどうかを示すdone
プロパティを持つオブジェクトをブール値で返す。 引数を指定してnext()
メソッドを呼び出すと、ジェネレータ関数の実行が再開され、実行が一時停止されたyield
式がnext()
からの引数で置き換えられます。
ジェネレータ内のreturn
ステートメントを実行すると、ジェネレータは終了します(つまり、それによって返されるオブジェクトのdone
プロパティはtrue
に設定されます)。
ジェネレータが終了すると、その後の next()
コールはそのジェネレータのコードを一切実行せず、単にこの形式のオブジェクトを返します。 {value: undefined, done: true}
.