我遇到了一个与Meteor非常奇怪的问题,即单个页面需要很长时间才能加载。在确定一个对我来说真的没有意义的原因之前,我已经走了很多路线尝试排除故障。
从根本上说,我有一个两步过程,它收集一些初始数据,然后将几百条记录插入数据库。在第二页上,我需要能够为每个新记录分配用户。我也可以回到同一页面并编辑分配的用户,因此在第二种情况下插入已经发生 - 相同的延迟。
插入代码相对简单。
设置评估元数据&创建新的评估记录+项目:
// set updatingAssessment variable to stop subs re-loading as records are inserted
Session.set('updatingAssessment', true);
Meteor.call('insertAssessment', assessment, function(err, result) {
if (err) { showError(err.reason); }
var assessmentId = result.toHexString();
// some code excluded to get 'statements' array
Meteor.call('insertAssessmentItems',
assessmentId,
statements,
function(err, result) {
Session.set('updatingAssessment', false);
});
}
// hide first modal and show 2nd
Session.set("assessmentStage1", false);
Session.set("assessmentStage2", true);
从容量方面来说,我们会插入1条评估记录,然后再插入约200条评估项目
insertAssessment: function(assessment) {
this.unblock();
return Assessments.insert({
<<fields>>
}, function(err, result) { return result; });
},
insertAssessmentItems: function(assessmentId, statements) {
this.unblock();
for (i = 0; i < statements.length; i++) {
AssessmentItems.insert({
<<fields>>
}, function(err, result) { });
}
}
最初,我尝试了大量SO建议,在插件发生时不刷新订阅,使用this.unblock()释放DDP流量,使慢速页面上的查询无反应,只返回最小的字段,调用异步插入等等...所有这些都与初始插入或后续编辑相同的记录没有区别(即退出页面并返回以便插入已经发生)。
在注释掉所有数据库代码并从meteor方法返回一个字符串(具有相同的结果/滞后)之后,我查看了html页面本身的实际模板生成代码。
在评论出各个部分之后,我发现建立一个用户下拉列表的助手(对于那些约200条记录中的每一条重复)导致加载时间大幅增加。当我注释掉下拉列表创建时,页面加载发生在&lt; 5s,这是在一个更可接受的范围内,尽管仍然比我想要的慢。
这有两个奇怪之处,我希望有人可以说清楚:
Meteor最近有什么变化会导致速度放缓,因为我几个月没有显着改变我的代码并且它之前有效,尽管仍然需要大约10秒才能完全渲染页面。该页面也曾在加载时响应,而现在CPU停留在100%,选择用户非常滞后。
为什么阻止我的服务器方法的实际模板加载会返回?毫无疑问,我需要重新编写我的模板以提高效率,但我花了很多时间试图弄清楚为什么我的服务器方法没有快速返回值。我甚至分析了DDP流量,并且在等待模板加载时没有活动 - 没有重载子,没有方法返回,没有。
提前致谢,
大卫