2017-05-05 9 views
1

条件付きでJavaScriptジェネレータを停止する方法はありますか?次のようなイテレータで

function* idMaker(){ 
    let index = 0; 
    while(index < 3) 
     yield index++; 
} 

がどのように私は途中で条件に基づいて発電機を停止することを確認することができますか?

function* idMaker(){ 
    let index = 0; 
    while(index < 3) 
     if (checker(index)) 
      yield index++; 
     else 
      return; 
} 

発電機で使用することは適切ですか?おそらくC#のようにyield breakの代わりにbreakを使用する必要がありますか?

ここでMDNまたは仕様へのリンクを含めることができますか?

+1

機能を終了させるものはすべて動作します。その周りにベストプラクティスがあるとは思わない。 –

答えて

0

私は次のコードでこれを実験的に検証することにしました:

function checker(i) { 
    return i !== 2; 
} 

function* idMakerReturn(){ 
    let index = 0; 
    while(index < 3) 
     if (checker(index)) 
      yield index++; 
     else 
      return; 
} 

function* idMakerBreak(){ 
    let index = 0; 
    while(index < 3) 
     if (checker(index)) 
      yield index++; 
     else 
      break; 
} 

const a = idMakerReturn(); 
console.log('1', a.next()); 
console.log('2', a.next()); 
console.log('3', a.next()); 

const b = idMakerBreak(); 
console.log('1', b.next()); 
console.log('2', b.next()); 
console.log('3', b.next()); 

から壊れたときにどちらの変異体が正しく{ "done": true, "value": undefined }を返します。私は推測された関数型を観察することによってこれをTypeScriptでチェックしました。 returnすべてが正しく動作し、関数の戻り値の型がIterableIterator<T>あると

function* idGen(seed: string | undefined) { 
    if (!seed) { 
    return; // Or `break` 
    } 

    const something = seed.trim(); 
} 

。私はsomethingにしてもジャンプするラベルを提供するように求めていますbreak

はもはや(undefinedifによって処理されるためだけstring)アクセスに安全であると推測されていないが、string | undefined残っています。

これは、フェリックスが言うように、そのを締結する私をリードジェネレータ関数を終了何が正しくdone: trueアイテムを得られますが、それはbreakでないのに対し、エスケープ分析はそれで動作するためreturnが望ましいと思われます。

まだ正式な言葉が見つかりませんでしたが、それでも十分です。

1
+0

ジェネレータの実装では、 'yield'構文とそれに相当するものが、それを中断するために特に気になります。 –

+0

ジェネレータ内部の歩留まりを通常通り使用し、ジェネレータへの参照を取得してから、外部からジェネレータを停止して条件をチェックしてリターンを呼び出すと思いましたか? – quirimmo

+0

これは良い提案ですが、私はライブラリの使用を探していますので、発電機はコールサイトに責任を負う必要はありません。 –

関連する問題