优化Meteor方法的执行效率-异步执行
Meteor 提供了两种简单易于使用的异步化代码的方法,可以非常方便的优化我们的代码,他们分别是 Meteor.defer(func) 和 this.unblock(),这两中方法我更新喜欢 this.unblock(),因为它在释放主线程的同时,并没有改变你的程序流程,还是会按着代码的顺序执行,该返回的时候还是会返回代码执行的结果,unblock只是将后面的代码以非堵塞形式执行。
Meteor.defer(func),提供了超轻量级的异步方法,可以将任何代码包装在defer中,将他们编程异步执行。
if (Meteor.isServer) {
Meteor.methods({
'addStatus': function (status) {
Meteor.defer(function () {
console.log('sending emails');
});
console.log("status added")
},
'wait': function () {
this.unblock();
console.log('wait started');
Meteor._sleepForMs(3000);
console.log('wait is over');
return 100;
}
});
}
if (Meteor.isClient) {
Meteor.call('wait');
Meteor.call('addStatus', 'this is my status message');
}
上面的代码执行结果会是这样,仔细感受他们之间的差异:
wait started
status added
sending emails
wait is over
订阅更少的数据
每次页面加载时间消耗很大一部分来自于订阅数据,特别是当数据量慢慢变大之后,订阅数据将是影响app执行的重要因素。使用 limit 可以控制订阅数据的数量,通过 fields 过滤订阅数据的字段。
limit 可以作为订阅的必选项。
在表设计里有特别大的字段是,或者在完成功能后优化不必要的字段时,使用 fields 过滤和确定需要的字段。
Meteor.publish('getRecentWikis', function () {
var options = {
sort: {date: -1},
limit: 50,
fields: {topic:1, content: 1}
};
return Wiki.find({}, options);
});
没有数据直接返回订阅
订阅中不能使用findOne,因为findOne返回的是对象,而find返回的是指针,find().fetch() 返回的是对象数组。所以在订阅时必须返回指针。或者订阅状态。
Meteor.publish('lists.private', function() {
if (!this.userId) {
return this.ready();
}
return Lists.find({
userId: this.userId
}, {
fields: Lists.publicFields
});
});
通过转化器,减少内容
在订阅是可以使用 transform 方法预处理数据字段的内容,进一步减少和优化订阅的数据。
Meteor.publish('getRecentWikis', function (limit) {
limit = limit || 10;
var options = {
sort: {date: -1},
limit: limit,
fields: {topic:1, content: 1},
transform: function (wiki) {
var newWiki = {
topic: wiki.topic,
summary: wiki.content.substring(0, 100)
};
return newWiki;
}
};
return Wiki.find({}, options);
});
联合订阅
使用 reywood:publish-composite 组件可以让订阅的数据返回向关系的数据,简化了订阅数据的复杂度,Meteor.publishComposite 方法支持嵌套式的调用可以实现类似SQL里联合查询的效果,publish-composite 是 Meteor 重要的组件。
meteor add reywood:publish-composite
Meteor.publishComposite("productByCompany", function(id) {
return {
find: function() {
return Company.find();
},
children: [{
find: function(company) {
return Product.find({
companyid: company._id
});
},
}, {
find: function(company) {
return Column.find({
companyid: company._id
});
},
}, ]
}
})
缓存订阅数据
通过 meteorhacks:subs-manager 组件可以将每个页面订阅的数据缓冲,这样可以进一步加速和优化页面的加载速度。
meteor add meteorhacks:subs-manager
var subscriptions = new SubsManager();
subscriptions.subscribe('singlePost', 'id1');
Tracker.autorun(function() {
if(subscriptions.ready()) {
// all the subscriptions are ready to use.
}
});
更快的加载
页面加载 meteorhacks:fast-render 组件。
meteorhacks:fast-render
FastRender.debugger.showLogs();
FastRender.debugger.hideLogs();
FastRender.debugger.blockDDP();
FastRender.debugger.unblockDDP();
FastRender.debugger.disableFR();
FastRender.debugger.enableFR();
共同学习,写下你的评论
评论加载中...
作者其他优质文章