【问题标题】:Intensionally delay data synchronisation for subscribed collection故意延迟订阅集合的数据同步
【发布时间】:2014-05-04 07:51:37
【问题描述】:

Meteor 应用,典型模式,我在服务器上发布,在客户端订阅。

反应性很好,但现在我需要让客户端同步其本地 minimongo(或者,可以说,从服务器获取新值)每个,比如说 30 秒。

有没有办法做到这一点?换句话说,我必须能够将同步延迟 n 秒,并每隔 n 秒重复一次。

现在唯一想到的模式是一个非常肮脏的模式 - 只需使用另一个助手进行布局,它只会每 n 秒更新一次,但这并不能节省我的流量,因为会发生同步无论如何,我只会在视觉上让它看起来像它不是实时同步的。

【问题讨论】:

  • 只是出于好奇,你为什么要这么做?
  • 好吧,想象一下流星的显微镜帖子被 10k 用户点赞 - 帖子每秒会抓取。我不想要实时的,我想要延迟。
  • 你确定吗?你测试和确认了吗?因为我不认为那是真的。
  • 是的,我确定。爬行我的意思是(假设你有upvote和downvote)每个帖子都会每秒跳跃,这会让你的眼睛一团糟。
  • 啊,我以为你的意思是通常意义上的爬行(慢下来)。不过,这听起来更像是一个 UI 问题。

标签: meteor


【解决方案1】:

似乎您不一定要阻止订阅本身停止/启动(这会变得很困难,因为流星会认为没有数据并会被动地删除所有内容)。

实际上,您只是想阻止 UI 经常更新。一种方法如下,它将本地游标查询更改为每 5 秒临时响应(允许 DOM 更新),然后立即不响应:

# client.coffee

Meteor.setInterval ->
  Session.set('reactive', true)
  Session.set('reactive', false)
, 5000

Template.test.helpers
  docs: -> Collection.find {}, {reactive:Session.get('reactive')}

这将是我最初演示这个概念的方法,它看起来很老套;它适用于一个小应用程序,但我还没有在任何大的应用程序中测试它。我从未见过在真正的应用程序中使用过这种东西,但请理解您可能想要它的原因。

【讨论】:

  • 这似乎是我提到的肮脏的变种,但至少它是一个解决方案,不是完美的。
  • 这种方法比其他建议效果更好,到目前为止我还没有遇到任何重大问题,所以我将其标记为可接受的答案。
【解决方案2】:

另一种方法是在每个文档中添加updateTimestamp。然后,您可以发布所有文档,直到特定时间戳,并每 30 秒更新一次。确保您不会在每次添加或更改文档时都获得文档

最大的困难是管理客户端和服务器之间的时间差。

Meteor.publish("allPosts", function(until){
    return Posts.find({updateTimeStamp: {$lte: until}});
});

在客户端

Meteor.setInterval(function(){
    Meteor.subscribe("allPosts", new Date());
}, 30000)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-14
    • 2016-02-07
    • 2018-09-03
    • 2017-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-02
    相关资源
    最近更新 更多