我正在使用一个名为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交互。