Generator.prototype.next()

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since September 2016.

next() メソッドは、2 つのプロパティ donevalue を持つオブジェクトを返します。 next メソッドに引数を提供して、ジェネレーターへ値を送ることもできます。

構文

js
generatorObject.next(value)

引数

value

ジェネレーターへ送る値です。

この値は yield 式の結果として代入されます。例えば variable = yield expression の場合、 .next() 関数に渡された値は variable に代入されます。

返値

以下の 2 つのプロパティを持った Object です。

done (boolean)

イテレーターが反復処理の末尾を過ぎている場合、値は true になります。この場合、 value はオプションでそのイテレーターの 返値 を指定します。

イテレーターが反復処理の次の値を生成することができた場合、値は false になります。これは done プロパティを指定しない場合も同等です。

value

イテレーターが yield または return した、何らかの JavaScript の値です。

next() の使用

次の例では、 next メソッドが返す簡単なジェネレーターとオブジェクトを示します。

js
function* gen() {
  yield 1;
  yield 2;
  yield 3;
}

const g = gen(); // "Generator { }"
g.next(); // "Object { value: 1, done: false }"
g.next(); // "Object { value: 2, done: false }"
g.next(); // "Object { value: 3, done: false }"
g.next(); // "Object { value: undefined, done: true }"

リストでの next() の使用

この例では、 getPage はリストを受け取り pageSize 件ごとにページ分割します。それぞれの next 呼び出しは個々のページを返します。

js
function* getPage(list, pageSize = 1) {
  for (let index = 0; index < list.length; index += pageSize) {
    yield list.slice(index, index + pageSize);
  }
}
const list = [1, 2, 3, 4, 5, 6, 7, 8];
const page = getPage(list, 3); // Generator { }
page.next(); // { value: [1, 2, 3], done: false }
page.next(); // { value: [4, 5, 6], done: false }
page.next(); // { value: [7, 8], done: false }
page.next(); // { value: undefined, done: true }

ジェネレーターへ値を送る

この例では next を値付きで呼び出しています。

メモ: 最初の呼び出しではジェネレーターが何も生成していないため、何もログを記録しません。

js
function* gen() {
  while (true) {
    let value = yield null;
    console.log(value);
  }
}

const g = gen();
g.next(1);
// "{ value: null, done: false }"
g.next(2);
// 2
// "{ value: null, done: false }"

仕様書

Specification
ECMAScript Language Specification
# sec-generator.prototype.next

ブラウザーの互換性

BCD tables only load in the browser

関連情報