0

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

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

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

对不起,如果这是一个如此简单的问题。我是流星的新手。

提前致谢。

4

3 回答 3

0

假设您正在使用 Meteor.Collection,根据 Meteor 的文档,您可以通过以下方式关闭查询的反应性:

your_collection.find({}, {reactive: false})

然后当你想更新你的结果时,再次调用它。在你的情况下,每分钟调用一次。

于 2014-07-11T07:19:56.097 回答
0

我认为客户端轮询不是定期发送数据的好方法。如果不断更新的唯一问题是屏幕闪烁,那么只需定期更新模板助手即可。

客户端代码的粗略示例:

Meteor.setInterval( function(){
    Session.set('refresh', new Date());
}, 1000);

Template.whatever.helpers({
  logs: function(){
    Session.get('refresh');
    return Logs.find({},{reactive:false});
  }
 });
于 2014-07-10T11:28:06.610 回答
-1

如果您觉得流星无法处理此负载,则可能不值得将流星用于您的用例。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 分钟检查一次有点浪费,而且收到推送通知总是会更快。

于 2014-07-10T09:02:17.340 回答