2017-01-06 4 views
5

私のような行がある場合:yieldは* whileループと同等ですが、javascriptではプレーン・イールドですか?

yield* foo() 

を私はの曲に何かでそれを置き換えることができます:

while(true) { 
    var x = foo.next(); 
    if(x.done) 
     break; 
    yield x; 
} 

明らかにそれはより冗長ですが、私は降伏*があれば理解しようとしています単に構文的な砂糖、またはいくつかの意味的側面があるかどうかは不明です。

+3

いや、それはかなりいるのです。簡単です: 'for(var x of foo()){yield x; } '。仕様:http://www.ecma-international.org/ecma-262/7.0/#sec-generator-function-definitions-runtime-semantics-evaluation。 * edit:*イテレータを取得するには、最初に* foo()を呼び出す必要があります。 –

+0

_ "他のジェネレータまたはiterableオブジェクトに委譲するために' yield * '式が使われています。" _ https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/yield* – guest271314

+0

ありがとう、@FelixKling。私はセミコロンのがんを発症していると感じています。 –

答えて

1

yield xの代わりにyield x.valueを実行する必要があります。イテレータを取得するには、fooに電話する必要があります。 .nextは、fooジェネレータによって返されるイテレータのメソッドです。

function *foo() { 
 
    yield 1; 
 
    yield 2; 
 
    yield 3; 
 
} 
 

 
function *f() { 
 
    yield *foo(); 
 
} 
 

 
console.log(Array.from(f())); 
 

 
function *g() { 
 
    var iterator = foo(); 
 
    while (true) { 
 
    var x = iterator.next(); 
 
    if (x.done) break; 
 
    yield x.value; 
 
    } 
 
} 
 

 
console.log(Array.from(g()));

関連する問題