【问题标题】:Meteor.subscribe is skipped, doesn’t work in Tracker.autorunMeteor.subscribe 被跳过,在 Tracker.autorun 中不起作用
【发布时间】:2015-07-31 20:13:27
【问题描述】:

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

但是订阅不起作用,这让我很生气。

虽然 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 集合没有改变。只是发布一个不同的集合。是这个原因吗?

感谢您的阅读。

【问题讨论】:

  • 我发现订阅只在第一次运行或重新加载页面。自动运行时它被惊人地跳过,没有回调 onReady 或 onStop 出现。 (对不起,我应该添加更多回调细节)
  • 我传递了一个变量,但它仍然不起作用..我正在寻找什么样的因素导致订阅跳过
  • 哦,如果我通过 Random.id() 就会运行 !!!!!

标签: meteor publish-subscribe


【解决方案1】:

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

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

因此,由于您总是使用相同的参数调用 subscribe,因此流星实际上并没有重新启动它。诀窍就是传递额外的参数来破坏这种“优化”。例如:

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

这应该也可以工作,但效率可能会低一些,因为它会在用户的任何属性发生变化时触发。

【讨论】:

    【解决方案2】:

    我认为你应该在订阅之后运行“控制台日志”并且发布方法返回一些东西,如果你在中间做一些事情是不应该工作的,因为服务器还没有返回任何东西,添加一个回调到订阅。

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

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

    【讨论】:

    • 我添加了回调,客户端正常显示回调,但是服务器没有重新发布并显示console.log。发布仍然跳过它...还是谢谢你
    • 我不认为它是这样工作的,发布被调用一次,它不会在数据更改后触发,也许看看docs.meteor.com/#/full/observe_changes。此外,您不需要将订阅包装在自动运行中,只需将其放在代码中的某个位置(或路由器中的路由)
    猜你喜欢
    • 1970-01-01
    • 2018-11-28
    • 2011-09-10
    • 2021-05-23
    • 1970-01-01
    • 2017-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多