コンテンツにスキップ

JavaScript/next()

出典: フリー教科書『ウィキブックス(Wikibooks)』


next()

[編集]

next() は、JavaScript のジェネレータオブジェクトで使用されるメソッドで、ジェネレータ関数の実行を制御し、次の yield で指定された値を返します。ジェネレータ関数は一時停止可能な関数であり、next() メソッドを呼び出すことで、関数の実行を再開することができます。

構文

[編集]
generatorObject.next([value]);

next() メソッドは、引数として任意の値を受け取ります。この値は、yield 式によってジェネレータ関数に渡されます。

使用例

[編集]

基本的な使用例

[編集]
function* numbers() {
  yield 1;
  yield 2;
  yield 3;
}

const gen = numbers();
console.log(gen.next().value);  // 1
console.log(gen.next().value);  // 2
console.log(gen.next().value);  // 3
console.log(gen.next().done);   // true

この例では、numbers ジェネレータ関数が順番に `1`、`2`、`3` を yield し、next() メソッドを使ってジェネレータを進めています。最後の next() の呼び出しで donetrue になり、ジェネレータが終了したことがわかります。

next() に渡す引数

[編集]
function* process() {
  const value = yield 'Start';
  console.log('Received:', value);
  yield 'End';
}

const gen = process();
console.log(gen.next().value);  // 'Start'
gen.next('Received value');      // 'Received: Received value'
console.log(gen.next().value);  // 'End'

next() に渡された引数は、ジェネレータ関数内での yield 式に渡されます。この例では、`next('Received value')` が value に渡され、console.log で出力されます。

done プロパティ

[編集]

next() メソッドは、結果としてオブジェクトを返します。このオブジェクトは、ジェネレータが終了したかどうかを示す done プロパティを持っています。

function* count() {
  yield 1;
  yield 2;
  return 'done';
}

const counter = count();
console.log(counter.next());  // { value: 1, done: false }
console.log(counter.next());  // { value: 2, done: false }
console.log(counter.next());  // { value: 'done', done: true }
console.log(counter.next());  // { value: undefined, done: true }

この例では、next() が呼ばれるたびに、ジェネレータは一時停止し、次の値を返します。最後の呼び出しで done プロパティが true になり、ジェネレータが終了したことが示されます。

ジェネレータの制御

[編集]

next() メソッドを使うことで、ジェネレータ関数の実行を細かく制御することができます。yield によって一時停止した関数の実行を、必要に応じて再開したり、値を渡したりできます。

使用の注意点

[編集]
  • next() メソッドは、ジェネレータ関数を一時停止する yield 式がある位置まで実行し、その時点で valuedone プロパティを含むオブジェクトを返します。
  • ジェネレータ関数は、一度終了した後は再度実行することはできません。終了したジェネレータに対して next() を呼び出しても、常に `{ value: undefined, done: true }` が返されます。
  • next() に引数を渡すことで、yield に値を送信できます。この送信された値は、yield 式が評価される際に使われます。

関連項目

[編集]

参考

[編集]