【问题标题】:How to manually poll data with meteor?如何使用流星手动轮询数据?
【发布时间】:2014-07-16 11:14:34
【问题描述】:

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

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

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

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

提前致谢。

【问题讨论】:

    标签: javascript meteor minimongo


    【解决方案1】:

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

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

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

    【讨论】:

    • 嗯...我之前确实尝试过。问题是,虽然集合不是反应性的,但我无法再次从客户端发出 find() 调用并使 minimongo 缓存刷新,即它不断返回旧数据。我将在下面尝试其他解决方案并更新每个人。感谢您的帮助。
    【解决方案2】:

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

    客户端代码的粗略示例:

    Meteor.setInterval( function(){
        Session.set('refresh', new Date());
    }, 1000);
    
    Template.whatever.helpers({
      logs: function(){
        Session.get('refresh');
        return Logs.find({},{reactive:false});
      }
     });
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 600000 /*1 minute poll*/ 我觉得你有点太喜欢零了;P
      • 谢谢@PeppeL-G 修复它。
      • 你的方法叫做yourdata,而不是somequery
      • 在我的情况下,数据库不断变化并且相对较快。从可用性的角度来看,我不会让客户端不断更新,因为否则它看起来像一个“tail -f”窗口:-) 感谢您的详细反馈。我试试看。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-16
      • 2015-07-24
      • 1970-01-01
      • 2014-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多