试图理解node.js中的生成器/产量 - 什么执行异步函数?

Duk*_*gal 17 yield generator node.js

Node.js现在有了生成器.

我的理解是,生成器可用于编写看起来更加线性的代码,并避免回调地狱和厄运风格编码的金字塔.

所以到目前为止,我的理解是在生成器内部,代码执行直到达到"yield"语句.此时暂停执行生成器功能.该yield语句指定一个返回值,该值可以是一个函数.通常,这将是一个阻塞I/O函数 - 通常需要异步执行的函数.

yield的返回函数返回到任何称为生成器的函数.

我的问题是,此时会发生什么?究竟是什么执行了yield返回的阻塞I/O函数?

编写看似线性的生成器/良品代码是正确的,需要有一种特定类型的函数来调用生成器,这是一个循环生成器并执行yield返回的每个异步函数的函数并返回异步功能返回发电机的结果?

我仍然不清楚如何执行yield返回的asynch函数.如果它由调用生成器的函数执行,它是否异步执行?我猜是因为否则会导致阻塞行为.

总结一下我的问题:

  1. 要用生成器编写"线性"异步代码,是否需要有一个遍历生成器的调用函数,执行生成函数作为回调并将回调结果返回给生成器?
  2. 如果问题1的答案是肯定的,那么生成的函数究竟是如何执行的 - 异步?

任何人都可以提供更好的概述/总结整个过程的工作原理吗?

Bru*_*ier 12

使用生成器编写异步代码时,您将处理两种类型的函数:

  • 声明的正常函数function.这些功能无法屈服.您无法与它们以同步方式编写异步代码,因为它们会一直运行完成; 您只能通过回调处理异步完成(除非您调用额外的功能,如node-fibers库或代码转换).
  • 声明的生成器函数function*.这些功能可以产生.您可以在其中编写同步样式的异步代码,因为它们可以产生.但是,你需要创建该生成器的伴侣功能,处理回调和恢复产生了next每一次回调火灾通话.

有几个库实现了伴随功能.在大多数这些库中,伴随函数一次处理一个function*,您必须function*在代码中的每个库中放置一个包装器.Galaxy库(我写的)有点特别,因为它可以处理function*调用其他function*没有中间包装器.伴侣功能有点棘手,因为它必须处理一堆发生器.

由于yield/next您function*和伴侣功能之间的舞蹈很少,执行流程可能难以理解.理解流程的一种方法是使用您选择的库编写示例,console.log在代码和库中添加语句,然后运行它.