【问题标题】:Access Generator Result in Finally Block在 finally 块中访问生成器结果
【发布时间】:2016-12-18 01:31:00
【问题描述】:

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

【问题讨论】:

  • 你不能只声明try之外的值吗?
  • 不,值是由iterator.return(value)外部确定的

标签: javascript ecmascript-6 generator finally


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    有没有办法在 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 访问(如果没有被覆盖)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-18
      • 2013-02-01
      相关资源
      最近更新 更多