2013-05-27 183 views
1

我已經建立了一個簡單的模型在C++中,我希望流星與之交互。 目前模型是作爲命令行運行的,一切工作都很好,但調用命令行是異步完成的。該模型速度非常快,因此我不需要結果進行回調,而且在此過程中使用回調會使流星的數據庫訪問更加複雜,這是我想避免的。流星執行系統命令同步

所以,我們剛進來的常規問題:如何使一些異步JavaScript中同步...

我知道,這已經討論了使用節點,這個話題已經在這裏回答: node.js execute system command synchronously

這就是說,如何在流星中實際做/設置它?

我們應該使用npm來安裝軟件包,但是隨着Meteor改變了它的分發系統,那麼它是如何讓它自己處理npm軟件包的呢?看看here,看看我說的,我一直沒能找到任何相關信息,關於這個package.js

爲了避免安裝外部包,我想過用Fibers,其內部使用由流星,但仍然:是否有人有如何封裝一個異步調用的例子?最後但並非最不重要的一點,Fibers開發人員幾乎建議我們不要直接使用Fiber代碼,而是使用其他一些子工具...爲什麼不能,但我回到瞭如何包含npm包的問題

我的代碼看起來是這樣的(有點簡化):

function callToEngine(argument, callback) 
      { 
       var result = null; 
       var modelPath = "/some/where" 

       var require = Npm.require; 
       var spawn = require('child_process').spawn; 
       var model = spawn(modelPath, []); 
       var answerBuffer = ""; 

       engine.stdin.write(argument); 
       engine.stdin.end(); //flush 

       engine.stdout.on('data', function(data) 
       { 
        answerBuffer+=data; 
       }); 

       engine.stderr.on('data', function(data) 
       { 
        console.log('stderr: ' + data); 
       }); 

       engine.on('close', function(code) 
       { 
        result = JSON.parse(answerBuffer); 
        console.log('child process exited with code ' + code); 
        callback(result); 
       }); 
      } 

我想有這樣的:

var result = callToEngine(argument); 
+0

可能重複[meteorJS從服務器調用shell命令](http://stackoverflow.com/questions/13782754/meteorjs-call-a-shell-command-from-the-server) –

+0

@DanDascalescu此問題特定於同步系統調用這意味着流星等待系統的答案。 [其他問題](http://stackoverflow.com/questions/13782754/meteorjs-call-a-shell-command-from-the-server)更通用 –

回答

3

你可以使用一個未來:

function callToEngine(argument) { 
    var Future = Npm.require('fibers/future'); 

    var fut = new Future(); 


    ///do stuff 

    engine.on('close', function(code) 
      { 
       result = JSON.parse(answerBuffer); 
       console.log('child process exited with code ' + code); 
       fut.return(result); 
      }); 

    return fut.wait(); 
} 

然後只需使用:

var result = callToEngine(argument); 

未來將確保返回將只返回的東西時,fut.return運行

在流星異步指南等設計

更多信息:https://gist.github.com/possibilities/3443021