2013-08-02 56 views
2

我有一個相當大的Backbone.js項目,所以我期望延遲加載儘可能多的資源。使用jQuery解決許多Backbone依賴關係延遲對象

考慮需要加載它自己的模板,子視圖的一些模板和集合的視圖。 (我不希望有等待每異步依賴於請求在下單前解決。)這將是有益的,如果我可以做類似...

initialize: function() { 

    $.when([ 
    Handlebars.get('Template1', callback),   // callback sets this.template 
    Handlebars.get('Template2', callback),  // callback sets subview template 
    App.Store.get('MessageCollection', callback) // callback sets this.collection 
    ]).then($.proxy(this.render, this));   // render 
} 

get功能有一些幫手我建立的一個服務了資源,如果它在緩存/存儲存在,否則它會返回延期對象...

return $.ajax(...) 

因此,這些get傭工需要返回一個jQuery Deferred對象不管是什麼。在緩存/存儲中找到資源時,是否有任何問題返回已解析的延遲對象?

App.Store.get = function(resource, callback) { 

    if (resource exists) { 
    return $.Deferred().done(callback).resolve(); 
    } else { 
    var model = new App.Model; 
    return model.fetch(); 
    } 
} 

這會導致任何問題嗎?有一個更好的方法嗎?

+1

不,這沒什麼錯。但是,如果將實際的延遲對象存儲在緩存中,則只需返回舊的已解析延遲對象,而不是創建新的對象。 –

+0

聽起來不錯。 –

+0

我想過,但我需要'deferred.reject()。done(callback).resolve()'。覺得會有什麼表現收益? –

回答

0

通常,您的方法應該按原樣工作。 您可以使用jquery.whenall插件以並行等待多個請求。

但是,如果項目實際上是更復雜的不僅僅是幾個模板加載,你應該看一下像require.js

+0

我想我會得到一個require.js的答案。它看起來對代碼庫非常有侵略性。我會再看一遍。 –

+0

jQuery的'when'和'whenall'插件有什麼區別? –

+0

jquery的時候會立即返回,如果有什麼失敗,而當所有的時候都會等到它們全部完成之後纔會返回,無論是否失敗。 –

0

一些AMD的解決方案如果存儲直接在高速緩存中的舊遞延對象,你可以只歸還原樣。

var cache = {}; 

App.Store.get = function(resource, callback) { 

    if (cache[resource]) { 
    return cache[resource].done(callback); 
    } else { 
    return cache[resource] = new App.Model.fetch().done(callback); // assuming this returns a deferred obj 
    } 
} 
+0

這使得抓取返回的數據變得困難,回調代理爲一個,甚至可以在後續的「get」中調用。 –