2017-04-26 39 views
2

背景:v8支持收益率(旧闻,我知道),那是伟大的JavaScript代码,如什么是node.js中使用回调做掉(见https://wingolog.org/archives/2013/05/08/generators-in-v8node.js:如何从C++模块中产生?

问题 :由于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/)的地方,但我的搜索并没有屈服(双关语意)任何结果...

+0

为什么不这样做'产量mycppmodule.someFunction()'和移动的问题了层? – Alnitak

回答

2

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

如果你想使用基于生成器的协同程序(像co模块或蓝鸟的coroutine),那么情况就有点不同 - 任何协程刚返回一个承诺,你从发电机产生究竟是一种承诺,你想要解决并注入发生器的下一轮运行,但在这里似乎并不是这样。

话虽如此,首先确保你的想法可以在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(); 
} 

如果你是C OK挂上原来的values()功能然后继续阅读。

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

请参阅该文档:

+0

感谢您指点我正确的方向!用你答案的数据,我能够提出正确的问题 - 这是我在开始时想要的:http://stackoverflow.com/questions/36556778/javascript-generator-function-written-in-c –