流星:延迟加载,渲染后加载.最佳实践



我有一个非常"慢"的流星应用程序,因为有很多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');
    },

最新更新