流星の呼び出しを同期させる方法が必要です。これにより、呼び出しが実行されると、コードは結果が完了するのを待って、クライアントの次のコード行に進むことができます。
例えば:
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の後に実行されているようで、終了します。
どんな助けもいただければ幸いです
これは非常に一般的な質問であり、さまざまな形や形で尋ねられます。ほとんどの人は、非同期呼び出しを行っていることに気づいていません。ただし、解決策は常に同じです。サーバー上のメソッドコードをファイバーにラップするか、futureを使用します。
ベストプラクティスは、現在利用可能なMeteor._wrapAsync
関数を次のように使用することだと思います。たとえば、次のようになります。 Meteor:Meteor.method内で非同期関数を呼び出し、結果を返す
他のいくつかのオプションはここで説明されています: https://Gist.github.com/possibilities/3443021
更新:メソッドはMeteor.wrapAsync
と呼ばれるようになりました。
メソッドの完了後に実行するコードをメソッドコールバックに入れます。これは、非同期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...';
}
});
私は 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});
}
);
同期ではありませんが、コールバックで戻り値を取得することに注意してください