node.js:如何从C ++模块中产生?

背景 :v8支持yield(旧消息,我知道),这是非常好的做的JavaScript代码callback,如在node.js中使用(请参阅https://wingolog.org/archives/2013/05/ 08 / generators-in-v8 )

这个问题 :由于一个JavaScript协程可以调用C ++代码(通过一个模块),被调用的C ++如何执行一个yield操作呢? 为了显示:

// javascript function* values() { yield 27; mycppmodule.someFunction(); } // c++ mycppmodule::someFunction() { __somehow_yield( 28 ); // how can we make this happen? } // user of the code above var o = values(); o.next(); // returns 27 - came from javascript above o.next(); // returns 28 - came from c++ above, which is invoked by js 

我怀疑答案是在V8 API( https://v8docs.nodesource.com/node-7.4/ ),但我的search没有收益(双关语意图)任何结果…

你的mycppmodule.someFunction(); 即使它是用JavaScript编写的,也不能从生成器函数values()返回的生成器中生成values() 。 如果你想在C ++中做一些和JavaScript中的其他代码一样的东西,那么你首先必须确保它能在JavaScript中工作。

如果你想使用基于生成器的协程(比如co模块或者蓝鸟的coroutine ),那么情况有点不一样 – 任何协程都只是返回一个promise,而你从generator生成的结果实际上是一个你想要parsing和注入的承诺在发生器的下一次运行中,但在这里似乎不是这种情况。

之前已经说过,首先确保你的想法可以在JsvaScript中实现,我认为这是:

 function* values() { yield 27; someFunction(); } let someFunction = // fill the blanks var o = values(); o.next(); // returns 27 - came from generator o.next(); // returns 28 - came from someFunction() 

不能在不改变values()生成器函数的情况下实现:

 function* values() { yield 27; let gen = someFunction(); yield gen.next(); } 

要么:

 function* values() { yield 27; yield* someFunction(); } 

如果您可以更改原始values()函数然后继续阅读。

现在,生成器函数所做的就是返回一个生成器的对象。 该生成器具有诸如.next() .throw().return() 。 如果你在C ++中创build了一个具有正确接口的对象,那么你可以在JavaScript中使用它作为关键字的生成器,例如yield*但是我将不得不testing它以确保它。

看文档:

  • 产量
  • 产量*
  • function*
  • 发电机