2

我可能在这里展示了我对 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
};

我对这个问题的理解是“if”语句在回调可以设置 msg 变量之前执行。那正确吗?还是范围界定问题?我什至可以这样做,从模板中调用“调用”吗?

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

4

2 回答 2

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)");
    });
  }
};

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

于 2012-10-08T01:47:34.050 回答
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
});
于 2012-10-06T22:11:03.587 回答