![](/img/trans.png)
[英]Why this generator function in JavaScript is stopping before any yield expression?
[英]Why is yield statement of a javascript generator function returning parameters of .next()?
我在MDN上偶然发现了生成器函数 ,让我感到困惑的是以下示例:
function* logGenerator() {
console.log(yield);
console.log(yield);
console.log(yield);
}
var gen = logGenerator();
// the first call of next executes from the start of the function
// until the first yield statement
gen.next();
gen.next('pretzel'); // pretzel
gen.next('california'); // california
gen.next('mayonnaise'); // mayonnaise
我不明白为什么作为console.log
参数的yield
语句返回传递给生成器的.next()
方法的参数。 这是否发生,因为空的yield
必须返回.next()
方法的第一个参数的值?
我还尝试了一些例子,似乎证实了上述陈述:
gen.next(1,2,3); // the printed value is 1, the 2 and 3 are ignored
// and the actual yielded value is undefined
还有一种方法可以访问生成器函数体内的.next()
方法的其他参数吗?
我注意到的另一件事是,当yield语句将这些值返回到console.log
它们实际上并不作为生成器的输出。 我必须说我觉得很困惑。
好问题。 我认为在.next()
方法上阅读MDN是最有帮助的。 您可以在生成器函数本身中定义要传递的值(即yield 1
),或者通过类似gen.next(1)
通过next()
传递值
next()
方法本身返回一个Object,其中包含属性value
和一个boolean done
,表示生成器函数是否已完成(即,可用输出已耗尽,现在仅输出undefined
的值)。
也就是说,有两种方法可以访问/传递该value
。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Generator/next
混淆来自于yield
和next
具有不同的语法,而它们实际上做同样的事情。 生成器及其调用者是对称的(这就是为什么它们被称为“co” - 例程而不是“sub” - 例程)。 这两种功能都可以被认为是通过通信通道连接的,并且可以完成工作或休眠等待通道中的传入消息。 唯一的区别是发生器最初是睡着的(也就是说,它顶部有一个隐含的“监听”命令),而呼叫者最初是醒着的。
无论yield
和next
做同样的事情三件事情:
插图:
_ = console.log.bind(console) function *gen() { _('gen: good morning') _('gen: sending hi') _('gen: zzz') p = yield 'hi' _('gen: awake! got', p) _('gen: now sending fine') _('gen: zzz') p = yield 'fine' _('gen: awake! got', p) // *** } function main() { var g = gen() _('main: sending knock knock') _('main: zzz') r = g.next('knock knock') _('main: awake! got', r) _('main: sending how r u') _('main: zzz') r = g.next('how r u') _('main: awake! got', r) } main()
请注意,由于写入在读取之前,因此发送到生成器的第一条消息将丢失。 它只用于唤醒发电机。 还要注意我们如何让发电机处于休眠状态,因此未达到***
线。
[rv] =产量[表达];
expression定义通过迭代器协议从生成器函数返回的值。 如果省略,则返回undefined。
rv返回传递给生成器的next()方法的可选值,以恢复其执行。
基本上你打印出你发送的参数以继续执行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.