JavaScriptのジェネレーターの使用方法と実践例


  1. ジェネレーターの基本構文: ジェネレーターは、関数と似たような構文を持ちますが、functionキーワードの後にアスタリスク(*)を付けます。以下は、ジェネレーターの基本的な構文です。
function* myGenerator() {
  // ジェネレーターの本体
}
  1. yieldキーワードの使用: ジェネレーターの中で、yieldキーワードを使って値を返すことができます。yield文が実行されると、ジェネレーターは一時停止し、その値が呼び出し元に返されます。以下は、yieldキーワードの使用例です。
function* myGenerator() {
  yield 1;
  yield 2;
  yield 3;
}
const generator = myGenerator();
console.log(generator.next().value); // 1
console.log(generator.next().value); // 2
console.log(generator.next().value); // 3
  1. ジェネレーターを利用した非同期処理の制御: ジェネレーターは非常に便利な非同期処理の制御フローを作るために使用できます。以下は、非同期処理を制御するためにジェネレーターを使用する例です。
function* fetchData() {
  try {
    const data = yield fetch('https://api.example.com/data');
    console.log(data);
  } catch(error) {
    console.error(error);
  }
}
function runGenerator(generator) {
  const iterator = generator();

  function iterate(iteration) {
    if (iteration.done) {
      return iteration.value;
    }

    return Promise.resolve(iteration.value)
      .then(x => iterate(iterator.next(x)))
      .catch(x => iterate(iterator.throw(x)));
  }

  return iterate(iterator.next());
}
runGenerator(fetchData);

上記の例では、fetchDataジェネレーター内で非同期なリクエストを行い、その結果を制御フローに組み込んでいます。

ジェネレーターは、さまざまな場面で使用されるため、非常に強力なツールです。この記事では、ジェネレーターの基本的な使い方と、非同期処理への応用例を紹介しました。これにより、あなたのコードの品質と保守性を向上させることができます。