ジェネレータ関数は、呼び出されるとジェネレータオブジェクトを返します。ジェネレータオブジェクトは、next()メソッドを持ち、next()メソッドを呼び出すたびにyield文までの処理を実行します。yield文は値を返し、一時停止した状態で待機します。次にnext()メソッドが呼び出されると、ジェネレータ関数は直前のyield文から再開し、次のyield文まで処理を進めます。
ジェネレータ関数を使うことで、反復処理を簡潔に記述することができます。以下は、ジェネレータ関数を使用した反復処理の例です。
function* generateSequence() {
yield 1;
yield 2;
yield 3;
}
const sequence = generateSequence();
console.log(sequence.next().value); // 出力: 1
console.log(sequence.next().value); // 出力: 2
console.log(sequence.next().value); // 出力: 3
この例では、generateSequence()というジェネレータ関数を定義し、その中で3つの値をyieldしています。generateSequence()を呼び出すと、ジェネレータオブジェクトが返されます。次に、next()メソッドを呼び出すことで値を取得できます。各next()メソッドの呼び出しで、ジェネレータ関数の実行が一時停止し、次のyield文まで処理が進みます。
ジェネレータ関数は非同期プログラミングにも役立ちます。非同期ジェネレータ関数は、非同期処理を逐次的に実行するために使用されます。以下は、非同期ジェネレータ関数の例です。
function* fetchData() {
try {
const data1 = yield fetch('https://api.example.com/data1');
const data2 = yield fetch('https://api.example.com/data2');
console.log(data1);
console.log(data2);
} catch (error) {
console.error(error);
}
}
function runGenerator(generator) {
const iterator = generator();
function iterate({ value, done }) {
if (done) {
return;
}
value
.then(result => iterate(iterator.next(result)))
.catch(error => iterate(iterator.throw(error)));
}
iterate(iterator.next());
}
runGenerator(fetchData);
この例では、fetchData()という非同期ジェネレータ関数を定義し、fetch()関数を使用して非同期データを取得しています。runGenerator()関数を使用して非同期ジェネレータ関数を実行し、各非同期処理の結果をyield文で取得しています。エラーハンドリングも行われており、try-catchブロック内でエラーをキャッチしています。
ジェネレータ関数は、反復処理や非同期処理をより柔軟に制御するための強力なツールです。是非、これらのコード例を参考にして、JavaScriptでのジェネレータ関数の活用方法を学んでみてください。