【问题标题】:Meteor reactive publishes/subscribesMeteor 反应式发布/订阅
【发布时间】:2014-08-01 18:39:58
【问题描述】:

我目前正在开发流星中的聊天应用程序。首次进入房间时,您最初会收到 25 条消息。现在,随着新消息进入页面,该值应该相应上升。

到目前为止,我已经尝试了几种不同的方法,但都没有达到预期的效果。

我尝试在客户端设置一个会话变量,当消息计数增加时,它会被动地重新订阅给定的发布。这条路线的问题在于,这会产生不利影响,因为新消息进入页面上的所有消息都需要重新加载,因为订阅。

我最近尝试使用 reactive-publish 包,但运气不佳,因为该包本身有一些各种不利影响。

解决此类问题的最佳方法可能是什么?我希望有一个解决方案,我可以设置某种发布,该发布仅根据我在数据库中为每个用户的数值流式传输消息。

编辑:添加上下文

我在想一些事情

Meteor.publish 'messages', (roomId) ->
    dl = // Some value that I pull from the database, which gets updated as new messages come into a room

    Messages.find({room: roomId, type: "user_message"}, {sort: {time: -1}, limit: dl, fields: {_id: 1, name: 1, message: 1, room: 1, time: 1, type: 1}})

【问题讨论】:

  • 所以当订阅被激活时,您希望过去最多 25 条消息,以及之后的所有新消息?
  • 我想要那个房间里最近的 25 条消息,而不是之后的任何消息。

标签: meteor publish-subscribe


【解决方案1】:

通过使用低级发布 API 可以实现 Pub/Sub 灵活性的巨大灵活性 - 如此之多,以至于我刚刚写了 a blog post 关于它。它应该非常清楚当新文档出现在查询集中时如何更新变量。

【讨论】:

    【解决方案2】:

    您似乎希望每个用户都有一个基于他们进入聊天室的时间的唯一订阅,即Meteor.subscribe("messages", roomId, new Date),其中包括最多 25 条来自他们进入聊天室之前的消息。这是一种选择:

    Meteor.publish("messages", function (roomId, time) {
      var lastRecent = _.last(Messages.find({
        room: roomId, type: "user_message"
      }, {sort: {time: -1}, limit: 25}).fetch());
    
      var cutoffTime = lastRecent && lastRecent.time || time;
    
      return Messages.find({
        room: roomId, type: "user_message", time: {$gt: cutoffTime}
      });
    });
    

    如果您想连续添加例如每当用户滚动到聊天窗口顶部时,一次 25 条旧消息,请考虑您实际上可能不需要“订阅”这些旧消息。您可以设置一个方法调用,如Meteor.call("getNOlderMessages", {roomId: roomId, N: 25, priorTo: oldestShownTime}) 来获取它们,将它们插入客户端上的本地集合(例如OlderMessages = new Meteor.Collection(null);),然后执行以下操作:

    <template="messages">
      {{#each olderMessages}} {{> message}} {{/each}}
      {{#each messages}} {{> message}} {{/each}}
    </template>
    

    【讨论】:

    • time: -1 排序已经固有地处理了时间。我正在寻找的更多是随着 dl 变量更新而更新的发布。
    • 我希望限制变量为动态的原因是我还设置了一个系统,如果用户滚动到聊天框的顶部,我会在发布中添加额外的 25 条消息.
    • @Donny 乍一看这似乎是对的,但您不需要在最后一个光标中进行排序。
    • @David 对,不需要在最后一个游标中进行排序,而且没用,因为无论如何都需要在客户端重新排序。
    • @SeanCallahan 您应该将时间作为显式参数传递给发布函数,除非您同意进入聊天室的人收到与一小时前进入的人完全相同的消息集—— Meteor 让客户端尽可能共享发布实例(当 subscribe 的参数相同时)。
    猜你喜欢
    • 2014-07-09
    • 1970-01-01
    • 1970-01-01
    • 2016-11-29
    • 2017-11-30
    • 2013-11-18
    • 2016-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多