最终阻止访问生成器结果

时间:2016-12-18 01:31:00

标签: javascript ecmascript-6 generator finally

有没有办法在生成器的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)

2 个答案:

答案 0 :(得分:1)

不,无法访问传递给生成器内.return()的参数。它与return块中的try语句相同 - 您只能覆盖finally子句中的返回值,但不能读取它。

答案 1 :(得分:-1)

  

有没有办法在finally中访问迭代器的最终值   在发电机中阻塞?

是的,您只需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(如果没有覆盖)进行访问。