2012-11-02 29 views
8

非同期関数が終了するのを待つためにクライアントmethod.callを取得する方法はありますか?現在、関数の終わりに達し、未定義を返します。MeteorJS非同期コード同期Meteor.methods関数

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; 
     }); 
    } 
}); 
+0

クライアントからの流星メソッドの中で非同期タスクを実行することはできないと思います。ファイバーを使用してサーバーではオプションになる可能性があります。 – Andreas

答えて

6

最近のバージョンでは、標準的な(err, res)コールバックで機能をオン文書化されていないMeteor._wrapAsync機能を提供してきました同期関数に変換されます。つまり、コールバックが返るまで現在のファイバーが収束し、Meteor.bindEnviro現在の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  
    } 
}); 

またasyncFuncが、それを包む前に、右のコンテキストで呼び出されていることを確認するfunction#bindを使用する必要があります。 詳細については、https://www.eventedmind.com/tracks/feed-archive/meteor-meteor-wrapasync

6

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

var fut = new Future(); 
    asyncfunc(data, function(err, res){ 
     fut.ret(res); 
    }); 
    return fut.wait(); 
+0

私は未来/約束を提案するつもりだったが、それが流星に組み込まれていることに気付かなかった。場所のいたるところに便利です。 – Dror

+1

あなたはまっすぐなGです。これはショット発信者レベルのコードです。 – OneChillDude

+1

先物はもはやMeteor coreの一部ではなくなっています。 – iiz

0

更新:申し訳ありませんが、もっと慎重に質問を読む必要があります。この質問も同様に質問され、回答したようです。here

未来を別に考えると、別のモデルを非同期呼び出しから返されたデータで更新し、そのモデルの変更をサブスクライブすることが考えられます。


meteor.call documentationから、それはあなたのOpenSession関数の出力が含まれている必要があり、あなたのコールバック関数の結果引数(err, res)のように見えます。しかし、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; 
    } 
});