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

Meteor.subscribe is skipped, doesn’t work in Tracker.autorun

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

但是订阅不起作用,我快死了。

尽管 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}}); 
}

p.s 如果我在 Chrome 的控制台行中键入 Meteor.subscribe(“Lists”),它会工作并且服务器 运行 正常发布。

p.s Lists 集合没有改变。只是发布不同的集合。是这个原因吗?

感谢您的阅读。

我认为你应该 运行 "console log" 在订阅和发布方法之后 return 一些东西,如果你立即做一些事情是不应该工作的,因为服务器不是 return正在执行任何操作,向订阅添加回调。

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

希望对你有帮助,抱歉我的英语不好=)

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

However, if the next iteration of your run function subscribes to the same record set (same name and parameters), Meteor is smart enough to skip a wasteful unsubscribe/resubscribe.

所以因为您总是使用相同的参数调用订阅,所以 meteor 实际上并没有重新启动它。诀窍就是传递额外的参数来击败这个"optimization"。例如:

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

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