Meteor app,典型模式,我在服务器上发布,在客户端订阅。
反应性很好,但现在我需要让客户端同步其本地的最小值(或者,比如说,从服务器获取新值)仅每个,比方说,30秒。
有没有办法这样做?换句话说,我必须能够延迟 n 秒的同步,并且每 n 秒重复一次。
现在唯一想到的模式是非常脏 - 只需使用另一个帮助器进行布局,只更新每个 n 秒,但这并不能节省流量,因为同步无论如何都会发生,我只会在视觉上使它像实时同步一样。
答案 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')}
这是我最初的方法,只是为了演示这个概念,而且看起来非常hacky;它可以在一个小应用程序中运行,但我还没有对它进行任何大的测试。我从来没有在真正的应用中看到过这种东西,但要明白为什么你会想要它。
答案 1 :(得分:0)
另一种方法是为每个文档添加updateTimestamp
。然后,您可以将所有文档发布到特定时间戳,并每30秒更新一次。确保每次添加或更改文档时都不会获取文档
最大的困难是管理客户端和服务器之间的时差。
Meteor.publish("allPosts", function(until){
return Posts.find({updateTimeStamp: {$lte: until}});
});
并在客户端
Meteor.setInterval(function(){
Meteor.subscribe("allPosts", new Date());
}, 30000)