2016-04-06 5 views
0

Я узнаю о Generator.prototype.throw(), и я тестирую приведенный ниже код.Как работает Generator.prototype.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.throw(); 

В этом случае ошибка будет выброшено говоря «Uncaught неопределенными ...» под 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} 

В то же время, значение i был пропущен, как если бы g.next() также был выполнен.

Как это происходит?

ответ

2

И next(), и throw() Продолжите, где вы остановились. В вашем первом примере это будет до вашей первой строки:

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

Поэтому ошибка не обнаружена. В вашем втором примере это будет после выхода:

var value = yield i; -> throw() 

Поскольку ошибка попадает в ловушку, приложение продолжается до той же точки. После вызова next() приложение возобновляется.

+0

Спасибо за разъяснения. Я думал, что 'throw()' также войдет в тело функции Generator. Наверное, я ошибся ... – wanderyt

Смежные вопросы