我已经构建了一个滚动日志表,其中显示了最近的500个事件。我不希望它被反应,因为流量太高而且只会使屏幕不断闪烁。相反,我想让客户端每分钟轮询一次服务器。
我已经关闭了autopublish,并且服务器代码只发布了最近500个事件。客户端像往常一样订阅相同的频道。因为我没有在我的mongodb上运行副本集(即没有oplog),所以服务器根本不会起作用(如果我使用常规的mongo客户端来插入新文档,那么流星应用程序就不会知道它)。我认为这实际上对我有利,因为我根本不想要反应性。
我想我可以每分钟使用Meteor.setInterval来获取数据,但我不知道如何更新客户端minimongo数据缓存(或使其无效以便它可以要求服务器发布新的复制/增量)。
很抱歉,如果这是一个简单的问题。我是流星的新手。
提前致谢。
答案 0 :(得分:0)
我认为客户端轮询不是间隔发送数据的好方法。如果持续更新的唯一问题是屏幕闪烁,那么只需每隔一段时间更新模板帮助程序。
客户端代码的粗略示例:
Meteor.setInterval( function(){
Session.set('refresh', new Date());
}, 1000);
Template.whatever.helpers({
logs: function(){
Session.get('refresh');
return Logs.find({},{reactive:false});
}
});
答案 1 :(得分:0)
根据Meteor的documentation,假设你正在使用Meteor.Collection, 您可以通过以下方式关闭查询的反应性:
your_collection.find({}, {reactive: false})
然后,当您想要更新结果时,请再次调用它。在您的情况下,请每分钟拨打一次。
答案 2 :(得分:-1)
如果你觉得流星无法处理这个问题,那么就可能不值得使用Meteor作为你的用例。 Meteor的前端(Blaze)可以在没有Meteor的情况下在外部使用:https://github.com/meteor/blaze
我说这是DDP套接字的原因仍然是打开的。尽管如此,如果你想保持这种方式,你可以使用Meteor.call和Meteor.setInterval
服务器端
Meteor.methods({
"yourdata" : function(data) {
var somequery = MyCollection.find().fetch()
return somequery
}
});
客户端
Meteor.setInterval(function() {
Meteor.call("yourdata", function(err, result) {
Session.set("results", result);
});
}, 60000 /*1 minute poll*/);
然后在你的助手
Template.yourTemplate.helpers({
results: function() {
return Session.get("results");
}
});
然后您可以像以前一样使用{{#each results}}
来显示您的数据。
虽然您可以使用上面的代码执行此操作,但如果您可以选择:
请记住,如果您的数据库没有任何变化,那么使用轮询这种方式的开销远比使用普通的Meteor.publish更糟糕,特别是如果您正在使用oplog。
这是因为你会每分钟查询一次数据库,而使用普通的发布方法你不会对数据库进行一次调用(因为没有变化)
有点像每20分钟检查一次电子邮件或在手机上使用推送通知。如果您没有收到任何电子邮件,那么每20分钟检查一次就会有点浪费,并且获得推送通知总是更快。