0

我有一個流星應用程序,這是非常「慢」,因爲有很多API的調用。流星:Lazyload,渲染後加載。最佳實踐

我嘗試做的是掰開裝載/電話。

什麼,我只是做是:

  • 我已經通過鐵路由器裝載模板
  • 我waitOn第一個API呼叫完成
  • 然後我開始在接下來的API通話Template.myTemplate.rendered - 功能

這對我的應用程序的速度已經是一個很大的好處,但是我想把它分解得更多,因爲第二個調用實際上更像是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', ''); 
}; 

現在我有我的應用程序desscribed這裏的活性部位再次問題 - Meteor: iron-router => waitOn without subscribe正如我不能找到一個妥善的辦法更新我的客戶端每個用戶基礎集合。同樣在文檔中描述了發佈方法也創建了一個新的集合。 (新document's 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調用何時啓動下一輪。所以視圖一塊一塊地獲取數據。我現在只是困惑。

+0

這http://stackoverflow.com/questions/22147813/how-to-use-meteor-methods-inside-of-a-template-helper對解決我的問題足夠有幫助...我將在稍後回答我自己的問題 – delueg

回答

0

我的錯很簡單,因爲我thaught:你鴕鳥政策需要使用訂閱。

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

    },