2013-05-27 122 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