【问题标题】:On demand Publish on Meteor?在 Meteor 上按需发布?
【发布时间】:2015-06-18 20:13:33
【问题描述】:

有没有办法只在需要时发布对集合的更新? (例如,仅每 5 秒发送一次更新?)

我正在发布一个排行榜,其中显示了游戏中前 50 名(得分最高)的玩家。用户积分的更新频繁发生,因此排行榜变化非常频繁(每 1-5 秒)。每隔一分钟左右,服务器会在 forEach 循环中更新约 100 个用户的点数。问题是发布方法在所有 100 个元素都更新之前立即开始更新。这会产生令人痛苦的性能问题(多次向所有用户发布更新)...

有没有办法在所有更新完成之前暂停发布?还是一种仅每 5 秒而不是立即更新发布数据的方法?

感谢您的帮助! :)

【问题讨论】:

  • 听起来有点像我最近读到的一篇文章:tomkelsey.co.uk/reining-in-the-reactivity-with-meteor 或许会有所帮助:)
  • 第二次阅读您的问题后,您的前提是错误的。您首先询问如何“按需”(来自客户端)执行此操作,然后以“每 5 秒”为例,这是由服务器控制的。请将您的问题缩小到一个准确的问题。

标签: meteor publish-subscribe


【解决方案1】:

创建自定义出版物并获得控制权!

var pubsHandlers = [];

Meteor.publish('totalScore', function() {
  this.added('someClientCollection', 'totalScoreId', {
    totalScore : someGetTotalScoreFunction()
  });
  pubsHandlers.push(this); //Maaaaybe not the cleanest thing to do.
  this.ready();
});

Meteor.setInterval(function updateScores() {
  var newTotalScore = somegetTotalScoreFunction()
  pubsHandlers.forEach(function(pubHandler) {
    pubHandler.changed('someClientCollection', 'totalScoreId', {
      totalScore : newTotalScore
  });
}, 5000); //Each 5 seconds, update everyone

这就是正在发生的事情:

  1. 以自定义方式发布,由adding 将文档发布到我们的出版物,
  2. 记住发布处理程序以进行进一步更新,
  3. 稍后(此处为interval),使用记住的处理程序update 文档。

主要好处是让服务器完全控制发布及其更新。
主要缺点是使用push(this)。这不一定是坏事,但它看起来太可怕了......

【讨论】:

  • 我在 Meteor Devshop 视频中第一次看到这种模式。如果您碰巧知道是哪个视频,请随时在评论或编辑中添加链接。
【解决方案2】:

http://tomkelsey.co.uk/reining-in-the-reactivity-with-meteor/ 文章讨论了这个确切的问题,作者“使用了 Meteor 方法和通常的发布/订阅方法的组合。下面列出了一个简化的示例。

在主页的 onCreated 方法中,我从服务器请求一个排序的 item _id 数组并将它们保存到一个名为 itemIds 的会话变量中:

Meteor.call('getItemIds', function(err, res) {   
   Session.set('itemIds', res);
});

在服务端,方法定义为:

Meteor.methods({
   getItemIds: function() {
    return Items.find({}, {fields: {_id: 1}, sort: 
    {rank:1}}).fetch();
  }
});

然后我观察 itemIds 会话变量的任何更改并相应地(重新)订阅:

var self = this;
self.autorun(function() {
    self.subscribe('itemsById', Session.get('itemIds'));
});

在服务器上,发布如下所示:

Meteor.publish('itemsById', function(itemIds) {
    return Items.find({}, {_id: {$in: itemIds}});
});

我的模板迭代 itemIds 数组而不是 Items 集合光标。这意味着项目的顺序保持不变。

对于 itemIds 中的每个 _id,我都可以执行 Items.find(_id) – 数据将在我们的客户端 Items 集合中,由我们的 itemsById 订阅提供。

瞧,我们有一个反应性项目列表,在页面刷新之前将保持其顺序。”

听起来它可以适合你:)

【讨论】:

    猜你喜欢
    • 2015-12-09
    • 2018-12-29
    • 1970-01-01
    • 2018-03-27
    • 2015-03-05
    • 2015-10-19
    • 1970-01-01
    • 1970-01-01
    • 2016-03-18
    相关资源
    最近更新 更多