渲染完所有数据后停止在铁路由器中订阅

时间:2017-02-09 18:37:26

标签: meteor iron-router

我正在使用一个名为DataTables的反应式版本的程序包,名为aldeed:tabular。当检索大量文档时,它往往会大大降低服务器的速度,使得任何其他查询需要30秒才能加载,而通常它们会在一两秒后加载。 我认为它可能与用户在页面上时维护订阅有关,因此我想在加载所有数据后停止订阅,从而有效地消除了反应。

我正在使用铁路由器,这是我当前的控制器:

  waitOn: function () {
  this.subscribe("Suites",Session.get("query"));
  this.subscribe("JobsStatuses",Session.get("query"));

      },
 onRun: function () {
    Session.set("query",this.params.query);
    this.next();
  },
  onRerun: function () {
    this.next();
  },
  onBeforeAction: function () {
    this.next();
  },

我尝试创建两个函数来返回订阅处理程序并将它们传递给' waitOn'然后在' onBeforeAction'中引用相同的处理程序。一旦完成渲染就停止它们,但我不认为我可以在这里定义一个函数来做到这一点。

有关如何在渲染后停止铁路由器订阅的任何建议?

编辑: 集合中有200万个文档,我们有名称和更改列表的索引。 这是我正在使用的发布代码:

Meteor.publish('Suites', function (query) {
  var self = this;
  if (query === null) {
      this.ready();
      return;
  }
  if (query.name !== undefined) {
      query.parent_name = {$regex:query.name};
      delete query.name;
  }
  if (query.changelist !== undefined) {
      query.changelist = parseInt(query.changelist);
  }
  if (query.suite !== undefined) {
      delete query.suite;
  }
  var suites = {};
  var handle = Jobs.find (
        {$and : [query ,{parent_name:{$exists:1}}]}
  ).forEach(function(cl) {
      var suite = cl.suite;
      var status = cl.status;
      if (suites[suite] === undefined) {
          suites[suite] = {};
      }
      if (suites[suite][status] === undefined) {
          suites[suite][status] = 0;
      }
      suites[suite][status]++;
    });
    self.added('Suites', new Meteor.Collection.ObjectID(), suites);
    self.ready();
});

Meteor.publish('JobsStatuses', function (query) {
  if (query === null) {
      this.ready();
      return;
  }
  if (query.name !== undefined) {
      query.parent_name = {$regex:query.name};
      delete query.name;
  }
  if (query.changelist !== undefined) {
      query.changelist = parseInt(query.changelist);
  }

  var self = this;

  var num_passed = 0;
  var total = 0;
  var pipeline = [];
  var handle = Jobs.find (
        {$and : [query ,{parent_name:{$exists:1}}]},
        { status:1 }
  ).forEach(function(cl) {
        total++;
        if (cl.status === "passed") {
          num_passed++;
        }
      // Store the status as the _id
    });
    self.added('JobsStatuses', new Meteor.Collection.ObjectID(), {
        "num_passed":num_passed,
        "total":total
    });
    self.ready();
});

传递给发布的查询只能调用名称,这可能会导致10000个或更多文档。我们通常允许客户端按更改列表和名称进行搜索,最多可生成大约几百个文档。

显而易见的解决方案是不允许客户端仅按名称搜索,并始终查找最新的更改列表,但我仍然希望显示非反应性的结果,无论是使用订阅还是停止,或者不使用订阅,并以服务器请求 - 响应方式与Mongo交互。

0 个答案:

没有答案