如何使Meteor方法同步?

时间:2014-03-26 17:30:05

标签: methods meteor call sync synchronous

我需要一种方法让流星调用同步,以便在运行调用时代码等待结果完成,这样它就可以继续到客户端的下一行代码。

例如:

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之后运行,从而将其抛到了它的死亡状态

任何帮助都会得到应用

3 个答案:

答案 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});

            }
);

请注意,它不是同步的,但您会在回调中获得返回值