【问题标题】:Meteor: Lazyload, load after rendering. Best practiseMeteor:延迟加载,渲染后加载。最佳实践
【发布时间】:2015-06-18 12:46:02
【问题描述】:

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

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

我刚刚做的是:

  • 我已经通过 Iron-router 加载模板
  • 我等待第一个 API 调用已完成
  • 然后我在 Template.myTemplate.rendered - 函数中开始下一个 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 调用何时结束以开始下一轮。所以视图是一块一块地获取数据。我现在只是一头雾水。

【问题讨论】:

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


【解决方案1】:

我的错很简单:你不需要使用订阅。

我只是在 Meteor.call 的回调中添加了“error,result”

只有“结果”导致结果总是未定义的。

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');

    },

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多