8

非同期関数が終了するのを待つようにクライアントのmethod.callを取得するにはどうすればよいですか?現在、関数の最後に到達し、undefinedを返します。

Client.js

Meteor.call( 'openSession', sid, function( err, res ) {
    // Return undefined undefined
    console.log( err, res ); 
});

Server.js

Meteor.methods({
    openSession: function( session_id ) {
        util.post('OpenSession', {session: session_id, reset: false }, function( err, res ){
            // return value here with callback?
            session_key = res;
        });
     }
});
4

3 に答える 3

6

私はこの要点で答えを見つけることができました。method.call内から非同期コードを実行するには、Futuresを使用して、関数を強制的に待機させます。

    var fut = new Future();
    asyncfunc( data, function( err, res ){
        fut.ret( res );
    });
    return fut.wait();
于 2012-11-02T11:29:09.507 に答える
6

Meteorの最近のバージョンではMeteor._wrapAsync、標準の(err, res)コールバックを持つ関数を同期関数に変換する文書化されていない関数が提供されています。つまり、コールバックが戻るまで現在のファイバーが生成され、Meteor.bindEnvironmentを使用して、現在のMeteor環境変数を保持します(などMeteor.userId())

簡単な使用法は次のとおりです。

asyncFunc = function(arg1, arg2, callback) {
  // callback has the form function (err, res) {}

};

Meteor.methods({
  "callFunc": function() {
     syncFunc = Meteor._wrapAsync(asyncFunc);

     res = syncFunc("foo", "bar"); // Errors will be thrown     
  }
});

また、ラップする前に、それが正しいコンテキストで呼び出されてfunction#bindいることを確認するためにを使用する必要がある場合があります。asyncFunc詳細については、https ://www.eventedmind.com/tracks/feed-archive/meteor-meteor-wrapasyncを参照してください。

于 2014-02-04T03:21:20.613 に答える
0

更新:申し訳ありませんが、質問をもっと注意深く読むべきでした。この質問もここで質問され、回答されたようです。

先物とは別に、考慮すべき別のパターンは、非同期呼び出しから返されたデータで別のモデルを更新してから、そのモデルの変更をサブスクライブすることです。


meteor.callのドキュメントから、コールバック関数の結果引数(err, res)にopenSession関数の出力が含まれているように見えます。ただし、openSession関数から値を返さないため、戻り値は未定義です。

これをテストできます:

クライアント:

Meteor.call('foo', function(err, res) {
  console.log(res); // undefined
});

Meteor.call('bar', function(err, res) {
  console.log(res); // 'bar'
});

サーバ:

Meteor.methods({
  foo: function() {
    var foo = 'foo';
  },
  bar: function() {
    var bar = 'bar';
    return bar;
  }
});
于 2012-11-02T21:10:47.230 に答える