2015-01-03 43 views
0

想知道人們如何處理停止多個外部服務器調用嗎?我正在做所有的提取操作,因爲否則當我嘗試調用任何提取沒有完成並且沒有任何內容填充到集合中時。backbone js - 減少對服務器的調用

我是新來的骨幹,所以我可能錯過了一個訣竅..但有沒有辦法做一個獲取和存儲信息的地方,以便您永遠不必再次獲取,你只是作爲集合工作一個變量?我的所有信息都來自外部網站,因此如果可以的話,我不希望發生大量不必要的外部呼叫。我沒有更新服務器或其他任何東西,它只是只讀的。

其他人爲類似的設置做些什麼?我錯過了一些愚蠢的東西嗎?或者我爲此設置得不好?這是我到目前爲止(工作正在進行中)

哦另外:我在路由器中進行取指。這是一個壞主意嗎?

http://jsfiddle.net/leapin_leprechaun/b8y6L0rf/

.complete(
    //after the fetch has been completed 
    function(){ 
     //create the initial buttons 
     //pull the unique leagues out 
     var uniqueLeagues = _.uniq(matches.pluck("league")); 

     //pull the unique leagues out 
     var uniqueDates = _.uniq(matches.pluck("matchDate")); 

     //pass to info to the relative functions to create buttons 
     getLeagues(uniqueLeagues); 
     getMatchDates(uniqueDates); 
     homeBtn(); 
     fetched = true; 
    } 
); //end complete 

感謝您的時間!

+0

避免多個外部服務器訪問以及如何處理異步函數是完全不同的事情。您的觀點是什麼? – suish

+0

是不夠公平,也許我正在努力處理異步功能。如果我可以使用async正常工作,那麼我不必多次調用。我猜測它的癥結在於如何才能進行1次異步調用,並將該數據存儲在我可以使用的集合中,而不必在.complete –

+0

其實......如果我只是需要異步做一個只讀來啓動它?我可以在我的抓取方式上做異步:false嗎? –

回答

2

這是一個經常出現的問題,但答案很簡單。
也許我今天會做一些圖紙,如果有幫助的話。
我從來沒有花時間學習UML,所以原諒我。

1.問題

什麼,你現在有是這樣的:

enter image description here

的問題然而是,這是不是很活躍。
如果右邊的這3個函數需要從不同的ajax回調函數執行,它們需要被添加到任何這些回調函數中。
想象一下,您想要更改這3個函數中的任何一個函數的名稱,這意味着您的代碼將立即崩潰,並且您需要更新每個回調函數。

您的問題表明您覺得您希望避免每個函數分別執行異步調用,這確實是這種情況,因爲這會造成不必要的開銷。

2.事件聚集

的解決方案是實現事件驅動的方法,其工作原理是這樣的:

enter image description here

這種模式也被稱爲發佈/訂閱(或觀察者模式),因爲有發佈事件的對象(在本例中是左側)和訂閱對象(在右側)。
使用這種模式,您不需要在ajax回調完成後顯式調用每個函數;相反,對象訂閱某些事件,並在事件觸發時執行方法。這樣你總能確定這些方法將被執行。
請注意,當觸發事件時,也可以傳遞參數,這允許您從訂閱對象訪問集合。

3.骨幹實施

骨幹促進事件驅動的方法。
設置事件聚合是簡單的,可以做如下:

window.APP = {}; 
APP.vent = _.extend({}, Backbone.Events); 

從Ajax回調,你只需觸發事件(你給它任何你想要的名字,但按照慣例,分號是用作隔板):

APP.vent.trigger("some:event", collection); 

的三個接收對象訂閱事件如下:

APP.vent.on("some:event", function(collection){ 
    console.log(collection.toJSON()); 
}); 

而這basical所有。
需要考慮的一件事是確保當您使用「on」訂閱事件時,如果您不再需要該對象,則還需要通過調用「off」來取消訂閱。

+0

哇..非常感謝你花時間做到這一點。如果你不介意,我可以澄清一些事情嗎?你說「這些函數訂閱某些事件,並在事件觸發時執行方法。」 - 這個時候你在說點擊嗎?或者,舉個例子,就像'收集是人口稠密'事件? –

+0

pubsub可能無法幫助here.pubsub用於某種情況,如果您希望在視圖的子視圖中的其他視圖中更新一個視圖觸發器,問題是如果它能夠確保在使用它們時獲取模型或而不是 – suish

+0

@leapin_leprechaun不,我的意思是自定義事件,您可以按照答案的第3部分中的解釋自行設置。右側的對象可以是任何類型的對象;例如骨幹視圖對象,或使用純Javascript創建的自定義對象。當然,這並不排除這些視圖對象仍然可以對DOM觸發的事件作出反應(如點擊事件)。 – Trace

1

如何處理那就是一切都取決於你在Backbone.js的,但這裏是一個選項,你可以採取

創建視圖,其具有體作爲其E1和處理一切。(我一般用咖啡,這可能有一些語法錯誤)

$(document).ready(function() { 
    mainView = new MainView({el: "body"}); 
}); 

MainView = Backbone.View.extend({ 
    initialize : function(){ 
    this.prepareCollection(); 
    }, 
    prepareCollection : function(collection){ 
    _checker = function(){ 
     if (collection.length === _done) { 
     this.render(); 
     } 
    }; 
    _.bind(_checker,this); 
    collection.each(function(item){ 
     item.fetch(
     success : function(){ 
      //you can also initialize router here. 
      _checker(); 
     } 
    ); 
    }); 
    }, 
    rener : function(){ 
    //make instance of View whichever you want and you can use colleciton just like variable 
    } 
}) 
+0

非常感謝。是的,我真的不認爲我現在正在利用初始化,我一定會更多地考慮這一點。也不確定的el:「身體」的一部分,所以這也很好 - 感謝這 –