Meteor性能:不确定发布是否导致延迟
我的Meteor应用程序开始时运行缓慢,大约10秒钟,然后又变快了。我正在努力提高成绩,但很难找到真正的原因 我认为问题在于我发布了所有课程信息,如下所示:Meteor性能:不确定发布是否导致延迟,meteor,Meteor,我的Meteor应用程序开始时运行缓慢,大约10秒钟,然后又变快了。我正在努力提高成绩,但很难找到真正的原因 我认为问题在于我发布了所有课程信息,如下所示: if (Meteor.isServer) { Meteor.publish("courses", function() { return Courses.find(); }); } 我试着用卡迪拉来监控到底发生了什么。然而,看着结果,我开始认为这可能不是真正的问题 如果pubsub的响应时间只需要292ms,它应该不会感
if (Meteor.isServer) {
Meteor.publish("courses", function() {
return Courses.find();
});
}
我试着用卡迪拉来监控到底发生了什么。然而,看着结果,我开始认为这可能不是真正的问题
如果pubsub的响应时间只需要292ms,它应该不会感觉到滞后,但我想不出还有什么其他原因可以解释为什么应用程序在开始时会如此缓慢,然后又变快了。专家能给我指出重定向的方向吗
更新:
我可以在开始时通过以下更改来改善滞后的持续时间:
在/server/publications.js
if (Meteor.isServer) {
Meteor.publish("courses", function() {
// since we only need these two fields for the search bar's autocomplete feature
return Courses.find({}, {fields: {'catalog':1, 'titleLong':1}});
});
Meteor.publish("courseCatalog", function(catalog) {
// publish specific information only when needed
return Courses.find({"catalog": catalog});
});
}
在router.js
中,我做了相应的更改,因此我根据特定页面进行订阅。但是在开始的时候仍然有一些滞后,我想知道我是否可以进行更多的优化,以及开始时缓慢的真正原因是什么
更新2:
我按照建议做了如下修改:
Session.set('coursesReady',false)代码>启动时
在路由器中:
Router.route('/', function () {
Meteor.subscribe("courses", function(err) {
if (!err) {
console.log("course data is ready")
Session.set('coursesReady', true);
}
});
....
在/lib/helpers.js
中,返回typeahead库的数据
if (Meteor.isClient) {
Template.registerHelper("course_data", function() {
console.log("course_data helper is called");
if (Session.get('coursesReady')) {
var courses = Courses.find().fetch();
return [
{
name: 'course-info1',
valueKey: 'titleLong',
local: function() {
return Courses.find().fetch();
},
template: 'Course'
},
但是现在的问题是,当调用helper函数时,数据永远不会准备好。控制台打印:
问:如何确保仅在数据准备就绪后调用helper函数,或在数据准备就绪时再次调用helper函数?既然Session
是被动的,那么它不应该被自动调用吗?我现在无法检查这一点,但我相信您的问题可能是课程数据
助手在订阅中的1000多个文档准备就绪之前已经运行了多次,导致typeahead包重新运行一些昂贵的计算。试着这样做:
/client/views/global/helpers.js
Template.registerHelper("course_data", function() {
if (!Session.get('coursesReady')) return [];
return [ //...
/client/subscriptions.js
Meteor.subscribe("courses", function(error) {
if (!error) Session.set('coursesReady', true);
});
更新:
事实上,Meteor的新功能this.subscribe()
和Template.instance().subscriptionsReady()
非常适合于此<代码>会话
不是真正正确的选择,但它仍然应该进行反应性更新(不确定为什么它不适合您)。尝试对/client/views/navwithsearch.js
(和main)进行以下更改,尽管理想情况下这两个模板应该共享一个搜索模板:
其思想是将订阅的生命周期与实际使用该订阅的视图绑定在一起。这将延迟typeahead注入,直到订阅完全就绪。您可以发布一些未统一的代码吗?我不认为发布/订阅延迟是您的问题,但如果无法看到代码中发生了什么,就很难找到它。@sbking谢谢。这里是:@sbking我在原始问题中也做了一些更新,我正在调用
fetch()
三次。我相信这可能就是问题所在,我也相信这就是问题所在。我不明白的一件事是,if(!Session.get('coursesReady')返回[]调用代码>时,如果会话值仍然为false怎么办?我不应该设置某种回调吗?我用更多细节再次更新了问题。请看update2@MaximusS嗯,不知道为什么它不起作用。typeahead包可能不会在自动运行中实际运行您的助手,但这意味着我最初对您的性能问题的猜测可能是错误的。尝试使用新的模板实例绑定订阅功能,如我的更新中所示;尝试从创建或呈现的回调调用它{stack:(…),消息:“无法调用视图#从跟踪器计算自动运行…在有时间时从创建或呈现的回调调用它”}
:
Template.NavWithSearch.onCreated(function() {
this.subscribe('courses');
});
Template.NavWithSearch.onRendered(function() {
this.autorun(function() {
if (Template.instance().subscriptionsReady()) {
Meteor.typeahead.inject();
}
});
});