繁体   English   中英

为什么javascript生成器函数的yield语句返回.next()的参数?

[英]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

混淆来自于yieldnext具有不同的语法,而它们实际上做同样的事情。 生成器及其调用者是对称的(这就是为什么它们被称为“co” - 例程而不是“sub” - 例程)。 这两种功能都可以被认为是通过通信通道连接的,并且可以完成工作或休眠等待通道中的传入消息。 唯一的区别是发生器最初是睡着的(也就是说,它顶部有一个隐含的“监听”命令),而呼叫者最初是醒着的。

无论yieldnext做同样的事情三件事情:

  • 将其参数写入频道
  • 睡着了,听着收到的消息
  • 将传入的消息作为其值发出并唤醒(即继续使用它们下面的内容)

插图:

 _ = 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM