Meteor.subscribe被跳过,在Tracker.autorun中不起作用

时间:2015-05-19 20:05:09

标签: meteor publish-subscribe

我正在使用用户的个人资料将特定数据发布到客户端。

然而,订阅不起作用,它正在杀死我。

虽然Tracker.autorun()运行,但服务器不运行任何发布。

Tracker.autorun(function () {
   console.log(‘autorun is running');  
   console.log(Meteor.user()) //to be reactive to user's update
   Meteor.subscribe(“Lists”,{
    onStop:function() { 
        console.log('subscribe call back onStop'); 
        },
    onReady: function(){
        console.log('subscribe call back onReady'); 
    });
   console.log(Lists.find().count());
}

Meteor.publish('Lists', function(){
   console.log('publish is running’);
   var list = Meteor.users.findOne({_id: this.userId}).list; 
   return Lists.find({_id: {$in: list}}); 
}

如果我在Chrome的控制台行中键入Meteor.subscribe(“Lists”),它可以正常运行并且服务器正常运行。

p.s列表集合没有变化。只是发布一个不同的集合。是原因吗?

感谢您的阅读。

2 个答案:

答案 0 :(得分:2)

如果您仔细查看subscribe的文档,可以在有关反应式计算的部分中找到此注释:

  

但是,如果您的run函数的下一次迭代订阅了相同的记录集(相同的名称和参数),Meteor足够聪明,可以跳过浪费的取消订阅/重新订阅。

因为你总是用相同的参数调用subscribe,meteor实际上并没有重新启动它。诀窍就是传递额外的参数来打败这个"优化"。例如:

Tracker.autorun(function() {
  var user = Meteor.user();
  var list = user && user.list;
  if (!_.isEmpty(list)) {
    Meteor.subscribe('Lists', list, function() {
      console.log(Lists.find().count());
    });
  }
});

这里我们从用户中提取list变量(假设它已发布)并将其用作额外参数以强制重新运行订阅。如果它没有发布,你可以使用这样的随机ID:

Tracker.autorun(function() {
  var user = Meteor.user();
  Meteor.subscribe('Lists', Random.id(), function() {
    console.log(Lists.find().count());
  });
});

这也应该有效,但效率可能会低一些,因为只要用户的任何属性发生变化,它就会触发。

答案 1 :(得分:0)

我认为你应该在订阅之后运行“控制台日志”,并且发布方法会返回一些内容,如果你因为服务器还没有返回任何内容而无法正常工作,那么添加一个回调订阅。

Tracker.autorun( function() {
 Meteor.subscribe( "List", function() {
  console.log( "okok" );
  // do your magic
 }
};

希望它有所帮助,对不起我的英语=)