流星回调到Meteor.call回调中的sys.exec

时间:2013-12-24 01:28:57

标签: asynchronous callback meteor

我有一个触发Metor.call()的事件:

Meteor.call("runCode", myCode, function(err, response) {
  Session.set('code', response);
  console.log(response);
});

但是我在服务器runCode内的Metheor.methods函数也在其内部进行了回调,我无法找到一种方法让它在上面的代码中返回response。< / p>

runCode: function(myCode) {
  var command = 'pwd';

  child = exec(command, function(error, stdout, stderr) {
    console.log(stdout.toString());
    console.log(stderr.toString());

    // I Want to return stdout.toString()
    // returning here causes undefined because runCode doesn't actually return
  });

  // I can't really return here because I don't have yet the valuer of stdout.toString();
}

我希望有一种让exec回调返回runCode而不使用setInterval的内容的方法可以使用,但在我看来这是一种hacky方式。

1 个答案:

答案 0 :(得分:6)

你应该使用纤维中的未来。

请参阅此处的文档:https://npmjs.org/package/fibers

基本上,你想要做的是等到运行一些异步代码,然后以程序方式返回它的结果,这正是Future所做的。

您可以在此处找到更多信息:https://www.eventedmind.com/feed/Ww3rQrHJo8FLgK7FF

最后,您可能希望使用此程序包提供的Async实用程序:https://github.com/arunoda/meteor-npm,它会让您更轻松。

// load future from fibers
var Future=Npm.require("fibers/future");
// load exec
var exec=Npm.require("child_process").exec;

Meteor.methods({
    runCode:function(myCode){
        // this method call won't return immediately, it will wait for the
        // asynchronous code to finish, so we call unblock to allow this client
        // to queue other method calls (see Meteor docs)
        this.unblock();
        var future=new Future();
        var command=myCode;
        exec(command,function(error,stdout,stderr){
            if(error){
                console.log(error);
                throw new Meteor.Error(500,command+" failed");
            }
            future.return(stdout.toString());
        });
        return future.wait();
    }
});