2016-05-08 5 views
0

各呼び出しの後に整数を返すエンティティが必要です。イテレータ/ジェネレータから単一のイールド値を取得

たとえば、コードがあります。

var id = 0; //global variable =(

function foo() { 
    .... 
    console.log("Your unique ID is " + id++); 
    .... 
} 

です。しかし、私はこの仕事のために発電機を使いたい。

ような何か:

function* getId() { 
    var id = 0; 
    while (true) { 
     yield id++; 
    } 
} 

function foo() { 
    .... 
    console.log("Your unique ID is " + getId()); 
    .... 
} 

しかし、結果は空の図の引用です。私は何を逃したのですか?たぶんジェネレータを使用することは、この種の世代にとっては悪い考えですか?

答えて

7

あなたgetIdは、ジェネレータ関数を生成するジェネレータ関数です。
あなた..

  • が続い多分生命維持短いコード

をしたいあなたの名前空間を汚染したくない場合は、

function* IdGenerator() { 
    var i = 0; 
    while (true) { 
     yield i++; 
    } 
} 
IdGenerator.prototype.get = function() { 
    return this.next().value; 
}; 

var ids = IdGenerator(); 
function foo() { 
    … 
    console.log("Your unique ID is " + ids.get()); 
    … 
} 
3

ここで私が言うことができるものは間違っている、次のとおりです。あなたはすべての関数呼び出しのid値をリセットしている

  • 。出力する発電機イテレータを生成する必要が次の反復の値について
  • 、あなたはそのnext().value

にアクセスすることができますここでは例です:

function* getId() { 
 
var id = 0; 
 
    while (true) { 
 
     yield id++; 
 
    }; 
 
} 
 

 
var itId = getId(); 
 

 
function foo() { 
 
    console.log("Your unique ID is " + itId.next().value); 
 
} 
 

 
foo() 
 
foo()

+0

単一の値だけを返すジェネレータを持つ必要はないようです。なぜ 'return getId.id ++'だけではないのですか? –

+0

@FelixKling私はあなたに同意します。うまくいけば、これは単なる例です... – maioman

1

ような何かを行う必要がありますインクリメントされた変数を閉じると、あなたにはfunction*より良いサービスが提供されますsの場合

var getId = (function() { 
    var i = 0; 
    return() => i++; 
}()); 

getId(); // 0 
getId(); // 1 
getId(); // 2 
+0

既に矢印関数を使用しているならば、 'var getId =(i =>(> i ++)(0);' – naomik

+1

彼は発電機を使いたいと言った。 –

関連する問題