我需要一种方法让流星调用同步,以便在运行调用时代码等待结果完成,这样它就可以继续到客户端的下一行代码。
例如:
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之后运行,从而将其抛到了它的死亡状态
任何帮助都会得到应用
答案 0 :(得分:11)
这是一个非常常见的问题,被问到各种形状和形式。大多数人在进行异步调用时都没有意识到。但是,解决方案始终是相同的:将服务器上的方法代码包装成光纤或使用未来。
我认为,最佳做法是使用当前可用的Meteor._wrapAsync
函数,例如:
Meteor: Calling an asynchronous function inside a Meteor.method and returning the result
此处描述了其他一些选项: https://gist.github.com/possibilities/3443021
更新:此方法现在称为Meteor.wrapAsync
。
答案 1 :(得分:2)
将方法完成后要运行的代码放入方法回调中。这是任何异步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 :(得分:1)
我按照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});
}
);
请注意,它不是同步的,但您会在回调中获得返回值