一尘不染

试图了解node.js中的生成器/ yield-什么执行异步功能?

node.js

Node.js现在具有生成器。

我的理解是,可以使用生成器来编写看起来更线性的代码,并避免回调地狱和厄运样式编码的金字塔。

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

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

我的问题是,此时会发生什么?究竟是什么执行收益率返回的阻塞I / O功能?

编写看起来是线性的生成器/
yield代码是否正确,是否需要一种特定类型的函数来调用生成器,该函数循环遍历生成器并执行yield所返回的每个asynch函数并返回返回函数的结果返回到生成器?

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

总结我的问题:

  1. 要使用生成器编写“线性”异步代码,是否有必要在生成器上进行迭代的调用函数,将产生的函数作为回调执行,并将回调结果返回到生成器中?
  2. 如果对问题1的回答是“是”,那么产生的函数究竟是如何异步执行的?

任何人都可以对整个过程如何进行更好的概述/总结吗?


阅读 207

收藏
2020-07-07

共1个答案

一尘不染

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

  • __用声明的 普通 函数function。这些功能 无法 屈服。您无法以同步方式编写异步代码,因为它们可以完成。您只能通过回调处理异步完成(除非您调用node-fibers库或代码转换之类的额外功能)。
  • __用声明的 生成器 函数function*。这些功能 可以 产生。您可以在它们内部以同步样式编写异步代码,因为它们可以让步。但是您需要一个伴随函数来创建生成器,处理回调并在每次触发回调时通过调用恢复 生成器next

有几个实现 伴随功能的
库。在大多数这些库中,伴随函数function*一次只能处理一个,因此您必须function*在代码中的每一个周围都包装一个包装。星系库(我写的)有点特殊,因为它可以处理没有中间包装的function*其他调用function*。伴随函数有点棘手,因为它必须处理一堆生成器。

执行流程可能很难理解,因为yield/nextfunction*和伴侣函数之间的舞蹈很少。理解流程的一种方法是用您选择的库编写一个示例,console.log在代码和库中添加语句,然后运行它。

2020-07-07