ES2015(ES6)のジェネレーター関数を使用して、yieldキーワードを使用して複数の値を返すことができる関数を定義できるようになりました。 単純なジェネレーター関数の例を次に示します。

function* someGenerator(){
  yield 'Cats';
  yield 'Dogs';
  yield 'Birds';
}

functionキーワードの横にある*文字を使用して、ジェネレーター関数であることを示していることに注意してください。

次に、ジェネレーターのインスタンスを作成し、ジェネレーターで next()を呼び出して値を取得することにより、ジェネレーターから値を抽出しましょう。

const gen = someGenerator();

console.log(gen.next().value); // Cats
console.log(gen.next().value); // Dogs
console.log(gen.next().value); // Birds
console.log(gen.next().value); // Undefined

next()は、 value と、ジェネレーターの値が不足している場合にtrueを返すdoneというブール値を持つオブジェクトを返します。

const gen2 = someGenerator();

console.log(gen2.next().done); // false
console.log(gen2.next().done); // false
console.log(gen2.next().done); // false
console.log(gen2.next().done); // true

IDジェネレーター

ジェネレーター関数で無限を使用して、 next()が呼び出されるたびに新しいIDを生成する関数を作成できます。 この場合、無限ループは next()の呼び出しで1回だけ実行されるため、危険ではありません。

function* idGen(){
  let i = 0;
  while (true) {
    yield ++i;
  }
}

const myIdGen = idGen();

console.log(myIdGen.next().value); // 1
console.log(myIdGen.next().value); // 2
console.log(myIdGen.next().value); // 3
console.log(myIdGen.next().value); // 4