2014-09-26 74 views
5

如何使用Meteor wrapAsync流星包装异步语法

下面是什么,我试图做

if (tempTreatment.groupId === undefined) { 
     // create new group 
     Meteor.wrapAsync(Meteor.call('createTreatmentGroup', salon, tempTreatment.groupName, tempTreatment.groupName)); 

     // get group id 
     var getGroup = Meteor.wrapAsync(Meteor.call('getTreatmentGroup', salon, tempTreatment.groupName)); 

     console.log(getGroup); 
     tempTreatment.groupId = getGroup._id; 
} 

我想synchronosly运行这两个Meteor.call功能,但我得到undefinedconsole.log(getGroup);其shuold只返回一个对象。

回答

7

Meteor.wrapAsync是一个服务器端API,旨在将Node.js异步函数包装为需要回调作为最后一个参数,以使它们通过使用Future(光纤子库)显示为同步。 (更多信息请见:https://www.discovermeteor.com/blog/wrapping-npm-packages/

它并不打算用于客户端将异步Meteor.call转换为同步调用,因为在浏览器中,Remote Method Invokation调用始终是异步的。长话短说,你根本无法实现你想要做的事情,你必须使用回调函数,并在第一次方法调用的成功回调中嵌套你的第二个方法调用。

+1

在0.9.3中有[Meteor.wrapAsync](http://docs.meteor.com/#meteor_wrapasync),可以在任何地方使用。这是错误吗? – 2014-09-26 11:37:13

+3

我没有注意到。我认为他们制作了Meteor.wrapAsync的客户端版本,以便使用它的代码可以放入共享文件夹中而不会触发错误,但实际上这是用于服务器的。如果没有提供回调,'wrapAsync'的客户端版本只是简单地定义一个标准的'logErr'回调来代替,它只是记录错误(如果存在):https://github.com/meteor/meteor/blob/ 9608e6205019b69a302cde62e21fcae1c7d22e3d /包/流星/ helpers.js#L108 – saimeunt 2014-09-26 12:12:53