Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用meteor手动轮询数据?_Javascript_Meteor_Minimongo - Fatal编程技术网

Javascript 如何使用meteor手动轮询数据?

Javascript 如何使用meteor手动轮询数据?,javascript,meteor,minimongo,Javascript,Meteor,Minimongo,我建立了一个滚动日志表,其中显示了最近的500个事件。我不希望它是被动的,因为流量太高,它只会使屏幕不断闪烁。相反,我想让客户端每分钟轮询一次服务器 我已经关闭了autopublish,并且服务器代码只发布最后500个事件。客户端像往常一样订阅同一频道。由于我没有在我的mongodb上运行副本集(即没有oplog),因此服务器根本就没有反应(如果我使用常规mongo客户端插入新文档,meteor应用程序就不会知道)。我认为这实际上对我有利,因为我根本不想要反应性 我想我可以使用Meteor.se

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

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

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

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


提前感谢。

如果您觉得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缓存,即它不断返回旧数据。我将尝试下面的其他解决方案,并更新每个人。谢谢你的帮助。