2016-04-06 8 views
0

私はGenerator.prototype.throw()について学習しており、以下のコードをテストします。この場合Generator.prototype.throw()はどのように機能しますか?暗黙のnext()は含まれていますか?

var generator = function*() { 
    for(let i = 0; i < 10; i++) { 
    try { 
     var value = yield i; 
     console.log(i); 
    } catch(e) { 
     console.log("catch exception..."); 
    } 
    } 
}; 

var g = generator(); 
g.throw(); 

、エラーが言っスローされます「キャッチされていない未定義...」chrome v49下。

ただし、最初にg.next()を呼び出してからg.throw()を呼び出すと正常に動作します。一方

var generator = function*() { 
    for(let i = 0; i < 10; i++) { 
    try { 
     var value = yield i; 
     console.log(i); 
    } catch(e) { 
     console.log("catch exception..."); 
    } 
    } 
}; 

var g = generator(); 
g.next(); // Object {value: 0, done: false} 
g.throw(); // catch exception... 
g.next(); 
// 1 
// Object {value: 2, done: false} 

g.next()も実行されたかのように、i値がスキップされています。

どうしますか?

答えて

2

next()throw()の両方が残っています。最初の例では、これは最初の行の前になります。

-> throw() for(let i = 0; i < 10; i++) { 

したがって、エラーは検出されません。 2番目の例では、これは収量の後になります。

var value = yield i; -> throw() 

エラーが発生するので、アプリケーションは同じポイントに進みます。 next()を呼び出した後、そこからアプリケーションが再開します。

+0

ありがとうございます。私は 'throw()'もGenerator関数の本体に入ると考えました。私は間違っていたと思う... – wanderyt

関連する問題