我有一个非常"慢"的流星应用程序,因为有很多API调用。
我尝试做的是分解加载/调用。
我刚刚做的是:
- 我有通过铁路由器加载模板
- 我等待第一个 API 调用已完成
- 然后我在 Template.myTemplate.render - 函数中启动下一个 API 调用
这对我的应用程序的速度来说已经是一个很大的好处,但我想进一步分解它,因为第二次调用实际上更像是 5-25 个 API 调用。
所以我现在尝试做的是在渲染函数内部是一个自调用函数,只要没有更多事情要做,它就会调用自己并将响应保存在会话中。(直到现在它只是重写,但即使到现在我也无法得到)
Template.detail.rendered = function(){
//comma separated list of numbers for the API-Call
var cats = $(this.find(".extra")).attr('data-extra').split(',');
var shop = $(this.find(".extra")).attr('data-shop');
var counter = 0;
var callExtras = function(_counter){
var obj = {
categories : [cats[_counter]],
shop : shop
};
if(_counter <= cats.length){
Meteor.subscribe('extra', obj,function(result){
//TODO dickes todo... nochmal nachdenken und recherchieren
//console.log(_counter);
Session.set('extra',Extra.find('extra').fetch()[0].results);
counter++;
callExtras(counter);
});
}
};
callExtras(counter);
Session.set('loading_msg', '' );
};
现在我再次遇到此处描述的应用程序的反应部分的问题 - 流星:铁路由器 => 等待没有订阅 因为我找不到适当的方法来更新每个用户群集合的客户端。同样在文档中描述了发布方法还创建了一个新集合。(新文档的 ID)在这里 - http://docs.meteor.com/#/full/publish_added
这是从服务器发布
Meteor.publish('extra', function(obj){
var that = this;
Meteor.call('extra', obj, function(error, result){
if (result){
//console.log(result);
that.added("extra", "extra", {results: result});
//that.changed('extra','extra',{results: result});
that.ready();
} else {
//that.ready();
}
});
});
所以我的问题是:是否有一种更好的方法来构建我的代码意味着以某种方式解决问题?如果不是,我怎么能以最干净的方式实现它?因为据我了解,这只是一种奇怪的方式。
编辑:
例如。
我可以执行每用户集合(可能像现在这样仅客户端)并从服务器推送数据并仅订阅此集合吗?但是,我该如何检查异步 API 调用何时关闭以开始下一轮。因此,视图逐个获取数据。我现在只是很困惑。
我的错很简单:你不需要使用订阅。
我只是在 Meteor.call 的回调中添加了"错误,结果"
只有"结果"导致结果总是未定义的。
var cats = $(this.find(".extra")).attr('data-extra').split(',');
var shop = $(this.find(".extra")).attr('data-shop');
var counter = 0;
var callExtras = function(_counter){
var obj = {
categories : [cats[_counter]],
shop : shop
};
if(_counter <= cats.length){
Meteor.call('extra', obj,function(error,result){
var actual_session = Session.get('extra');
if(actual_session === false){
actual_session = [];
}
actual_session = actual_session.concat(result);
Session.set('extra',actual_session);
counter++;
callExtras(counter);
});
}
};
callExtras(counter);
然后在模板助手中
"extra" : function(){
return Session.get('extra');
},