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*
- 发电机