有意延迟订阅集合的数据同步

时间:2014-05-04 07:51:38

标签: meteor

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

您真的只想阻止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')}

这是我最初的方法,只是为了演示这个概念,而且看起来非常h​​acky;它可以在一个小应用程序中运行,但我还没有对它进行任何大的测试。我从来没有在真正的应用中看到过这种东西,但要明白为什么你会想要它。

答案 1 :(得分:0)

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

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

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

并在客户端

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