Meteor - 使用Meteor.call的返回值进行故障排除

时间:2012-10-06 22:08:14

标签: javascript meteor

我可能在这里显示我的javascript无知,但为什么这不起作用?我怎样才能重写这段代码才能使它工作?

// On the client
Template.tabs.title = function () {
  var msg;
  Meteor.call('getMessage', this.msg_id, function (error, result) {
    console.log(result); // Prints out a perfectly fine message object
    msg = result;
  });
  if (msg)
    return msg.title;
  else
    return "(empty)"; // This is always the value that's shown on the page
};

我对该问题的理解是在回调可以设置msg变量之前执行“if”语句。是对的吗?或者这是一个范围问题?我是否可以这样做,从模板中调用“call”?

我在这里使用方法的原因是Messages集合可能很大,我不能在客户端上整体订阅它。我订阅了部分内容,但无论我的订阅是什么,我都需要查找任意消息。

2 个答案:

答案 0 :(得分:3)

当你检查msg时,你还没有设置回调是正确的。我想最好的办法就是在回调返回时设置一个Session var,并依赖Meteor的反应来重新发送你的消息。类似的东西:

Template.tabs.title = function () {
  var title = Session.get('currentTitle');

  if (title) {
    return 'title';
  else {
    Meteor.call('getMessage', this.msg_id, function (error, msg) {
      Session.set('currentTitle', msg ? msg.title : "(empty)");
    });
  }
};

另一方面,我可能会说使用单一消息订阅来抓住“当前消息”会更有意义并且更具惯用性。

答案 1 :(得分:1)

为“call”方法传递的第三个参数是异步回调,当您尝试返回“msg”变量时,它尚未定义。

使用另一个回调,如下所示:

Template.tabs.retrieveTitle(callback){
  Meteor.call('getMessage', this.msg_id, function (error, result) {
   callback( (result) ? result.title : "(empty)" );
  });
}

您可以这样使用上述方法:

Template.tabs.retrieveTitle(function(){
//do what you want to
});