Javascript 如何使用meteor手动轮询数据?
我建立了一个滚动日志表,其中显示了最近的500个事件。我不希望它是被动的,因为流量太高,它只会使屏幕不断闪烁。相反,我想让客户端每分钟轮询一次服务器 我已经关闭了autopublish,并且服务器代码只发布最后500个事件。客户端像往常一样订阅同一频道。由于我没有在我的mongodb上运行副本集(即没有oplog),因此服务器根本就没有反应(如果我使用常规mongo客户端插入新文档,meteor应用程序就不会知道)。我认为这实际上对我有利,因为我根本不想要反应性 我想我可以使用Meteor.setInterval每分钟获取数据,但我不知道如何更新客户端minimongo数据缓存(或使其无效,以便它可以要求服务器发布新的副本/增量) 如果这是一个如此简单的问题,很抱歉。我是《流星》的新手Javascript 如何使用meteor手动轮询数据?,javascript,meteor,minimongo,Javascript,Meteor,Minimongo,我建立了一个滚动日志表,其中显示了最近的500个事件。我不希望它是被动的,因为流量太高,它只会使屏幕不断闪烁。相反,我想让客户端每分钟轮询一次服务器 我已经关闭了autopublish,并且服务器代码只发布最后500个事件。客户端像往常一样订阅同一频道。由于我没有在我的mongodb上运行副本集(即没有oplog),因此服务器根本就没有反应(如果我使用常规mongo客户端插入新文档,meteor应用程序就不会知道)。我认为这实际上对我有利,因为我根本不想要反应性 我想我可以使用Meteor.se
提前感谢。如果您觉得meteor无法处理此负载,那么在您的用例中使用meteor可能不值得。Meteor的前端(Blaze)可以在没有Meteor的情况下外部使用: 我之所以说这是因为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*/);
客户端
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分钟检查一次就有点浪费,而且获得推送通知总是会更快。我认为客户端轮询不是一种间隔发送数据的好方法。如果持续更新的唯一问题是屏幕闪烁,那么只需每隔一段时间更新模板辅助程序 客户机代码的粗略示例:
Meteor.setInterval( function(){
Session.set('refresh', new Date());
}, 1000);
Template.whatever.helpers({
logs: function(){
Session.get('refresh');
return Logs.find({},{reactive:false});
}
});
假设你用的是Meteor。根据Meteor的收藏, 您可以通过以下方式关闭查询的反应性:
your_collection.find({}, {reactive: false})
然后,当您想要更新结果时,请再次调用它。在你的情况下,按分钟计算
600000/*1分钟投票*/
我觉得你有点太喜欢零了;PThank you@PeppeL-G修复了它。您的方法称为yourdata
,而不是somequery
。在我的情况下,数据库会不断地相对快速地变化。从可用性的角度来看,我不会不断更新客户端,因为否则它看起来就像一个“tail-f”窗口:-)谢谢您的详细反馈。我试试看。嗯。。。我以前确实试过。问题是,虽然收集不是被动的,但我无法再次从客户端发出find()调用并刷新minimongo缓存,即它不断返回旧数据。我将尝试下面的其他解决方案,并更新每个人。谢谢你的帮助。