2016-04-14 81 views
1

我有一個大集合的異步函數,我有我想要暴露給lua的nodejs代碼。基本思想是我想執行lua腳本,並允許這些腳本回調我的一些nodejs代碼,以及異步地從執行的lua腳本返回一個值,自定義節點插件綁定到lua與擴展

在此示例中myCustomNodejsAddon將是我寫的自定義插件知道如何綁定lua並運行lua腳本。一個突出的問題是我如何從lua腳本異步返回值?

有沒有人做過這樣的事情?我會非常感興趣的任何指針,想法,例子。

編輯與更好的例子:

-- user written lua script 
getUser(1, function(err, user) 
    if err then 
     print('Error', err) 
    else 
     print('Found user with id', user.id) 
     return '' 
    end 
end) 
/*Create object with mapping of async functions*/ 
var callbacks = { 
    "getUser": function(userId, cb) { 
     db.Users.fetchById(userId).then(function(user) { 
     cb(null, user); 
     }, function(err) { 
     cb(err, null); 
     } 
    } 
}; 
myCustomNodejsAddon.provideCallbacks(callbacks); 

/* user written lua script has been stored into `scriptSrc` variable */ 
myCustomNodejsAddon.execute(scriptSrc, function(returnValueOfScript) { 
    console.log('done running user script: ', retrunValueOfScript); 
}); 

回答

0

不止一個辦法解決這個問題在我腦海中。

第一個是創建一個nodejs腳本,該腳本一旦執行就讀取程序命令行參數或輸入流,並執行此通道指示的代碼並將響應以JSON格式返回。這是做這件事的侵入性較小的方法。該腳本會是這樣的:

if(require.main === module){ 
    // asume first argument to be the source module for the function of iterest 
    var mod = require(process.argv[2]); 
    var fnc = mod[process.argv[3]]; 

    args = process.argv.slice(4); 

    // by convention the last argument is a callback function 
    args.push(function(){ 
     console.log(JSON.stringify(arguments)); 
     process.exit(); 
    }) 

    fnc.apply(null, args); 
} 

一個例子用法是:

$ node my-script.js fs readdir /some/path 

這將類似[空,[「文件1」,「文件2」]與文件acording迴應在/some/path。然後,您可以創建一個lua模塊,使用此腳本invoque節點並根據要調用的函數傳遞參數。

+0

這將如何處理問題的'async'部分?這個過程的盧阿方面是什麼樣的? –

+0

這將處理問題的異步部分,因爲一旦調用回調,Nodejs進程將只寫入輸出流。因此產生異步的結果。有一段時間我不使用Lua,所以我不知道如何實現該部分 – yeiniel

+0

可能你可以使用這裏給出的答案http://stackoverflow.com/questions/2829404/how-do-i-run -an-executable-using-lua – yeiniel