geneatorを簡単に理解する

2855 ワード

形式上、Generator関数は一般的な関数ですが、2つの特徴があります.1つは、functionキーワードと関数名の間にアスタリスクがあります.二つ目は、関数体の内部でyield文を使用して、異なる内部状態を定義することです.
function* helloWorldGenerator() {
  yield 'hello';
  yield 'world';
  return 'ending';
}
var hw = helloWorldGenerator();

Generator関数の呼び出し方法は、通常の関数と同様に、関数名の後ろにカッコを付けたものです.違いは、Generator関数を呼び出すと、その関数は実行されず、関数の実行結果ではなく、内部状態を指すポインタオブジェクトを返します.nextメソッドを呼び出すことで、ポインタを次の状態に移動させることができます.
hw.next()
// { value: 'hello', done: false }
hw.next()
// { value: 'world', done: false }
hw.next()
// { value: 'ending', done: true }
hw.next()
// { value: undefined, done: true }

これは基礎的な使い方です.もう一つ紹介しなければなりません.nextは関数内の変数に値を伝えます.
function* f() {
  for(var i = 0; true; i++) {
    var reset = yield i;
    if(reset) { i = -1; }
  }
}
var g = f();
g.next() // { value: 0, done: false }
g.next() // { value: 1, done: false }
g.next(true) // { value: 0, done: false }

上記のコードは、nextメソッドにパラメータがない場合、yield文に実行されるたびに変数resetの値が常にundefinedされる無限に実行可能なGenerator関数fを定義します.nextメソッドにパラメータtrueが付いている場合、変数resetはこのパラメータ(true)にリセットされるため、iは-1に等しくなり、次のループは-1から増加します.この機能は重要な構文的意味があります.Generator関数は一時停止状態から運転再開まで、コンテキスト状態(context)は変化しません.nextメソッドのパラメータにより、Generator関数の実行開始後、関数体の内部に値を注入し続ける方法があります.つまり、Generator関数の実行の異なる段階で、外部から内部に異なる値を注入して、関数の動作を調整することができます.これはasync/awaitを実現するために重要です.
転載先:https://www.cnblogs.com/junwu/p/11127764.html