如何用流星手动轮询数据?

时间:2014-07-10 04:00:05

标签: javascript meteor minimongo

我已经构建了一个滚动日志表,其中显示了最近的500个事件。我不希望它被反应,因为流量太高而且只会使屏幕不断闪烁。相反,我想让客户端每分钟轮询一次服务器。

我已经关闭了autopublish,并且服务器代码只发布了最近500个事件。客户端像往常一样订阅相同的频道。因为我没有在我的mongodb上运行副本集(即没有oplog),所以服务器根本不会起作用(如果我使用常规的mongo客户端来插入新文档,那么流星应用程序就不会知道它)。我认为这实际上对我有利,因为我根本不想要反应性。

我想我可以每分钟使用Meteor.setInterval来获取数据,但我不知道如何更新客户端minimongo数据缓存(或使其无效以便它可以要求服务器发布新的复制/增量)。

很抱歉,如果这是一个简单的问题。我是流星的新手。

提前致谢。

3 个答案:

答案 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分钟检查一次就会有点浪费,并且获得推送通知总是更快。