2016-12-18 6 views
2

Есть ли способ получить доступ к окончательному значению итератора в блоке finally в генераторе?Результат генератора доступа в конечном блоке

function*generator() { 
 
try { 
 
    let value1 = yield(1) 
 
    let value2 = yield(2) 
 
} finally { 
 
    console.log("Ending, how to access the result? (4)") 
 
} } 
 

 
var iterator = generator() 
 
var result1 = iterator.next(1) 
 
var result2 = iterator.return(4)

+0

Не можете ли вы просто объявить значения вне 'try'? – Carcigenicate

+0

Нет, значение определяется за пределами iterator.return (значение) –

ответ

0

Есть ли способ доступа конечного значения итератора в блоке, наконец в генераторе?

Да, вы можете просто return окончательное значение:

function* generator() { 
try { 
    var value1 = yield(1) // cannot use let here 
    var value2 = yield(2) // cannot use let here 
    console.log('never gets here'); 
} finally { 
    return [value1, value2]; 
} 
} 

var iterator = generator(), 
    result0 = iterator.next(), // starts the generator 
    result1 = iterator.next("a"), // "a" gets assigned to value1 
    result2 = iterator.return("b"); // "b" does not get assigned to value2 

console.log(result0); // { value: 1, done: false } 
console.log(result1); // { value: 2, done: false } 
console.log(result2); // { value: [ 'a', undefined ], done: true } 

.return("b") могло бы привести к result2 стать { value: 'b', done: true }. Однако в приведенном выше коде return [value1, value2] перезаписывается "b". Это позволяет получить доступ к окончательному результату в блоке finally.

Независимо от того, переписываете ли вы "b" или нет, он никогда не передается самому генератору для обработки и поэтому может быть доступен только как result2.value (если не перезаписывается).

0

Нет, невозможно получить доступ к аргументу, переданному .return() внутри генератора. Это то же самое, что и оператор return внутри блока try - вы можете только перезаписать возвращаемое значение в предложении finally, но не прочитать его.