试图理解node.js中的生成器/ yield – 执行asynchronous函数的是什么?

Node.js现在有了生成器。

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

所以到现在为止,我的理解是,在一个生成器中,代码执行直到达到“yield”语句。 发生器function的执行在此处暂停。 yield语句指定一个可能是函数的返回值。 通常这将是一个阻塞I / O函数 – 通常需要asynchronous执行的函数。

yield的返回函数返回到所谓的generator。

我的问题是,在这一点上会发生什么? 究竟是什么执行阻塞I / O函数的收益率返回?

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

目前还不清楚如何执行收益返回的asynchronous函数。 如果它是由调用生成器的函数执行的,是不是asynchronous执行? 我猜是这样,否则会导致阻塞行为。

总结我的问题:

  1. 要用发生器编写“线性”asynchronous代码,是否需要有一个调用函数来迭代发生器,执行函数的callback函数,并将callback的结果返回给生成器?
  2. 如果对问题1的回答是肯定的,那么所产生的函数是如何asynchronous执行的呢?

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

在使用生成器编写asynchronous代码时,您正在处理两种types的函数:

  • 函数声明的正常 function 。 这些function不能屈服。 您不能以同步方式编写asynchronous代码,因为它们运行完成; 您只能通过callback来处理asynchronous完成(除非您调用像node-fibers库或代码转换那样的额外function)。
  • function*声明的生成器函数。 这些function可以屈服。 你可以写同步代码的asynchronous代码,因为他们可以屈服。 但是,您需要一个伴随function来创build生成器,处理callback并在每次callback触发时通过next调用恢复生成器

有几个库实现伴侣function 。 在大多数这些库中,伴随函数一次处理单个function* ,并且必须在代码中的每个function*包装一个包装。 星系库(我写的)有点特殊,因为它可以处理function*调用其他function*而不用中间包装。 伴侣function有点棘手,因为它必须处理一堆发电机。

执行stream程可能很难理解,因为你的function*和伴侣函数之间的yield/next跳动很less。 理解stream程的一种方法是用你select的库编写一个例子,在你的代码和库中添加console.log语句,然后运行它。

如果[阻塞io函数]由调用生成器的函数执行,是否asynchronous执行? 我猜是这样,否则会导致阻塞行为。

我不认为发电机做asynchronous任务处理。 对于生成器,只有一件事情正在同时执行 – 只是一个函数可以停止执行并将控制权交给另一个函数。 例如,

 function iofunc1() { console.log('iofunc1'); } function iofunc2() { console.log('iofunc2'); } function* do_stuff() { yield iofunc1; yield iofunc2; console.log('goodbye'); } var gen = do_stuff(); (gen.next().value)(); (gen.next().value)(); //This line won't begin execution until the function call on the previous line returns gen.next(); //continue executing do_stuff 

如果您阅读了关于nodejs生成器的一些文章:

  1. http://jlong​​ster.com/2012/10/05/javascript-yield.html
  2. http://jlong​​ster.com/A-Study-on-Solving-Callbacks-with-JavaScript-Generators
  3. http://jlong​​ster.com/A-Closer-Look-at-Generators-Without-Promises

他们都使用额外的函数/库来添加asynchronous执行。

1:用发生器写“线性”asynchronous代码,是否需要有一个调用函数迭代发生器,执行函数的callback函数,并将callback的结果返回给生成器?

是。 我们称之为“启动器”。

2:如果问题1的答案是肯定的,那么确切地说,如何执行asynchronous函数 – asynchronous?

在生成器内部,您将生成一个包含函数及其参数的数组。 在控制调用者(launcher)中,你使用fn.apply(..,callback)来调用asynchronous,把调用放到“generator.next(data);” (恢复)在callback内。

asynchronous函数是asynchronous执行的,但是生成器会在屈服点“暂停”,直到调用callback(然后执行“generator.next(data)”)

完整的工作库和样本: https : //github.com/luciotato/waitfor-es6