为什么Generator.prototype.return需要一个值?

时间:2019-03-15 09:16:12

标签: javascript iterator generator

我试图弄清楚为什么Generator.prototype.return取值。

我知道它会停止生成器的处理,并使用以下命令呈现每个next调用:

{
    done: true,
    value: undefined,
}

但是,当您传递诸如generator.return(4)之类的值时,它所做的只是给您一个对象,就好像您调用了Generator.prototype.next而您的value道具是4。

我唯一的猜测是,在将生成器组合在一起或进行某种双向通讯时,这可能很有用;但是,由于双向通讯会杀死发电机,因此并没有多大意义。

1 个答案:

答案 0 :(得分:1)

.return()方法具有一个值,因为它以与.next().throw()相同的方式提供双向通信。

df <- vpcrimetotal year,vcrime,varrest,varrestperc,pcrime,parrest,parrestperc 2017,"1,247,321","518,617",0.4158,"7,694,086","1,249,757",0.1624 2016,"1,250,162","410,717",0.3285,"7,928,530","1,353,283",0.1707 2015,"1,199,310","505,681",0.4216,"8,024,115","1,463,213",0.1824 表达式可以有3种不同的结果:

  • 它可以像普通表达式一样求值到该结果的值
  • 它的计算结果类似于yield语句,导致异常
  • 它可以像throw语句那样求值,导致仅return语句在结束函数之前就被求值
  • (第四个可能的结果是生成器永远不会恢复)

可通过使用相应的值在挂起的生成器上调用相应的方法来实现。这包括异常值和返回值。

  

但是,当您传递诸如finally之类的值时,它所做的只是给您一个对象,就好像您调用了generator.return(4)而您的价值支柱是Generator.prototype.next

不一定。您可能会认为,在评估4语句时,它总是返回该返回值,并且与return语句中的异常不同,它无法被拦截。的确,在生成器函数中不能访问返回值,但是可以抑制或通过throw子句来更改返回值。

finally

(当然,在[ function* exampleA() { try { yield; } finally {} }, function* exampleB() { try { yield; } finally { yield 'Y'; } }, function* exampleC() { try { yield; } finally { return 'Z'; } }, function* exampleD() { try { yield; } finally { throw 'E' } } ].forEach(genFn => { try { const gen = genFn(); gen.next(); console.log(gen.return('X')); } catch(e) { console.log(e); } });子句中执行此类操作是不好的做法,但有可能)