2017-04-26 82 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 –