Есть ли способ доступа конечного значения итератора в блоке, наконец в генераторе?
Да, вы можете просто 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
(если не перезаписывается).
Не можете ли вы просто объявить значения вне 'try'? – Carcigenicate
Нет, значение определяется за пределами iterator.return (значение) –