我在c ++中构建了一个简单的模型,我希望meteor与之交互。 目前,该模型作为命令行运行,一切运行良好,但调用命令行是异步完成的。该模型非常快,因此我不需要结果进行回调,而且在此过程中涉及回调使得流星的数据库访问更复杂,这是我想要避免的。
所以,我们只是提出常规问题:如何在javascript中制作异步同步...
我知道这已经使用节点进行了讨论,这个主题已在这里得到解答: node.js execute system command synchronously
这就是说,如何在流星中实际进行/设置?
我们应该使用npm安装软件包,但是Meteor改变了它的分发系统,那么让它自己处理npm软件包的方式是什么?看看here看看我在说什么,我找不到任何关于这个包的相关信息.js
为了避免安装外部软件包,我考虑使用meteor内部使用的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 :(得分: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
运行时返回
Meteor异步指南中有关其他设计的更多信息:https://gist.github.com/possibilities/3443021