Meteor:Lazyload,渲染后加载。最佳做法

时间:2015-06-18 12:46:03

标签: javascript asynchronous meteor observer-pattern reactive-programming

我有一个非常“慢”的Meteor应用程序,因为有很多API调用。

我尝试做的是拆分加载/调用。

我刚刚做的是:

  • 我通过iron-router
  • 加载模板
  • i waitOn第一个API-Call已经完成
  • 然后我在Template.myTemplate.rendered - function
  • 中启动下一个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', '' );
};

现在,我的应用程序的被动部分再次出现问题 - Meteor: iron-router => waitOn without subscribe因为我无法找到更新我的客户端每个用户群集的正确方法。同样在文档中描述了发布方法也创建了一个新集合。 (新文档的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-Call何时开始下一轮。因此视图逐个获取数据。我现在很困惑。

1 个答案:

答案 0 :(得分:0)

我的错很简单,因为我可以:你不需要使用订阅。

我刚刚在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');

    },