web-dev-qa-db-ja.com

Meteorメソッドを同期させる方法は?

流星の呼び出しを同期させる方法が必要です。これにより、呼び出しが実行されると、コードは結果が完了するのを待って、クライアントの次のコード行に進むことができます。

例えば:

clientFunction = function(){

    Meteor.call('serverFunction', function(err,result){})//<--so when this gets a result and    
                                                    //is stored in a session variable
    var doSomeThing = Session.get('whatever') <-- so that your able to use it here
}

Whileループを使用して、値が返されるまで何も起こらないようにしようとしましたが、clientFunctionの後に実行されているようで、終了します。

どんな助けもいただければ幸いです

17
cronicryo

これは非常に一般的な質問であり、さまざまな形や形で尋ねられます。ほとんどの人は、非同期呼び出しを行っていることに気づいていません。ただし、解決策は常に同じです。サーバー上のメソッドコードをファイバーにラップするか、futureを使用します。

ベストプラクティスは、現在利用可能なMeteor._wrapAsync関数を次のように使用することだと思います。たとえば、次のようになります。 Meteor:Meteor.method内で非同期関数を呼び出し、結果を返す

他のいくつかのオプションはここで説明されています: https://Gist.github.com/possibilities/3443021


更新:メソッドはMeteor.wrapAsyncと呼ばれるようになりました。

12
Christian Fritz

メソッドの完了後に実行するコードをメソッドコールバックに入れます。これは、非同期JavaScriptの標準です。

clientFunction = function(){
  Meteor.call('serverFunction', function(err, result){
    if (err) {
      alert(err);
    } else {
      Session.set('whatever', result.whatever);
    }
  });
};

これにより、メソッド呼び出しが返されると、セッション変数の値が設定されます。ここで、Meteorの反応性を使用して、その変数を使用します。

Template.hello.helpers({
  myWhatever: function () {
    var whatever = Session.get('whatever');

    if (whatever) return whatever;

    return 'Loading whatever...';
  }
});
2
alanning

私は this チュートリアルに従い、以下のようなことをします

これは流星サーバー側の方法です

productIdResult:function(searchstring)
{
   {
      var skimlinks_query = Async.wrap(skimlinks.query);
      var title_val="title:\"electric bicycle\"  AND merchantCategory:*bikes*";                     
      var result = skimlinks_query({
                        searchFor: searchstring,
                        start:start,
                        rows:rows,
                        fq: "country:US"
                    });
      return result;
}

そして、私はこのようにクライアントからそれを呼び出します

Meteor.call('productIdResult',
            searchstring,
            function(error,resul)
            {
                arr[0]=resul.skimlinksProductAPI.products[0].title;
                $( "#op1").autocomplete({source:arr});

            }
);

同期ではありませんが、コールバックで戻り値を取得することに注意してください

1
Sasikanth