我试图弄清楚为什么Generator.prototype.return
取值。
我知道它会停止生成器的处理,并使用以下命令呈现每个next
调用:
{
done: true,
value: undefined,
}
但是,当您传递诸如generator.return(4)
之类的值时,它所做的只是给您一个对象,就好像您调用了Generator.prototype.next
而您的value
道具是4。
我唯一的猜测是,在将生成器组合在一起或进行某种双向通讯时,这可能很有用;但是,由于双向通讯会杀死发电机,因此并没有多大意义。
答案 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);
}
});
子句中执行此类操作是不好的做法,但有可能)