我有一个相当大的Backbone.js项目,所以我希望尽可能多地延迟加载资源。
考虑一个需要加载自己的模板,子视图的一些模板和集合的视图。 (在请求下一个异步依赖之前,我不想等待每个异步依赖关系解析。)如果我可以做一些像......那样会很有帮助。
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延迟对象。在缓存/存储中找到资源时,返回已解析的延迟对象是否有任何问题?
App.Store.get = function(resource, callback) {
if (resource exists) {
return $.Deferred().done(callback).resolve();
} else {
var model = new App.Model;
return model.fetch();
}
}
这会导致任何问题吗?有一个更好的方法吗?
答案 0 :(得分:0)
通常,您的方法应该按原样运行。 您可以使用jquery.whenall插件来并行等待多个请求。
但是如果项目实际上比仅加载几个模板更复杂,那么你可能应该看看像require.js这样的AMD解决方案
答案 1 :(得分:0)
如果您将旧的延迟对象直接存储在缓存中,则可以按原样返回。
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
}
}