1

meteor とやり取りしたい単純なモデルを C++ で作成しました。現在、モデルはコマンド ラインとして実行され、すべてがうまく機能していますが、コマンド ラインの呼び出しは非同期で行われます。モデルは非常に高速であるため、結果をコールバックで受け取る必要はありません。また、このプロセスにコールバックを含めると、流星の DB アクセスがより複雑になり、これは避けたいことです。

というわけで、よくある質問です: javascript で何かを非同期同期させるにはどうすればよいでしょうか…</p>

これはノードを使用して議論されていることを知っています。このトピックはすでにここで回答されています: node.js execute system command synchronously

これは、流星内でこれを実際に行う/設定する方法は?

npmを使用してパッケージをインストールする必要がありますが、Meteorが配布システムを変更したため、npmパッケージを単独で処理できるようにする方法は何ですか? ここを見て、私が話していることを確認してください。このpackage.jsに関する関連情報を見つけることができませんでした

外部パッケージのインストールを避けるために、 Meteor によって内部的に使用されているFibersを使用することを考えましたが、それでも非同期呼び出しをカプセル化する方法の例はありますか? 最後になりましたが、Fiber の開発者は、Fiber で直接コーディングするのではなく、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);
4

1 に答える 1

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.returnfuture は returnが実行されたときにのみ何かを返すことを保証します

Meteor Async Guide の他のデザインの詳細: https://gist.github.com/possibilities/3443021

于 2013-05-27T20:29:00.617 に答える