正确使用Meteor wrapAsync

时间:2015-08-01 13:48:58

标签: meteor

以下是我要做的事情:

var joinNetwork = function (obj) {
  Meteor.call("joinNetwork", {
    userId: obj.userId,
    domain: obj.domain
  }, function (err, networkId) {
    return networkId;
  });
}    

Accounts.onCreateUser(function (options, user) {
  var userId = user._id;
  var email = options.email;
  var domain = Utils.getDomain(email);
  var joinNetworkSync = Meteor.wrapAsync(joinNetwork);

  // works fine until here

  var networkId = joinNetworkSync({
    userId: userId,
    domain: domain
  });

  // never get here
  debugger

正如您所看到的,在我致电joinNetworkSync之后,我从未接触过该代码。换句话说,networkId永远不可用。我做错了什么?

2 个答案:

答案 0 :(得分:1)

要从wrapAsync返回,您必须调用传递给该函数的回调:

Meteor.wrapAsync(function (obj, done) {
  Meteor.call("joinNetwork", {
    userId: obj.userId,
    domain: obj.domain
  }, function (err, networkId) {
    done(networkId);
  });
})

你不需要在这里包裹异步。当您调用meteor方法服务器端时,它们会像普通函数一样返回。如果正确定义了joinNetwork方法,则可以执行此操作:

Accounts.onCreateUser(function (options, user) {
  var userId = user._id;
  var email = options.email;
  var domain = Utils.getDomain(email);
  var networkId = Meteor.call("joinNetwork", {
    userId: obj.userId,
    domain: obj.domain
  });
  ...
})

答案 1 :(得分:0)

我认为你的joinNetwork同步版本没有返回任何内容。你在另一个函数中放置了一个返回,即joinNetwork的回调。尝试在另一个函数中拆分下一个部分,并使用networkId在回调函数内调用它。