2

我有一个相当大的 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();
  }
}

这会引起任何问题吗?有一个更好的方法吗?

4

2 回答 2

0

通常,您的方法应该按原样工作。您可以使用jquery.whenall插件来并行等待多个请求。

但如果项目实际上比仅加载几个模板更复杂,您可能应该查看一些 AMD 解决方案,例如require.js

于 2013-08-02T21:28:00.820 回答
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
  }
}
于 2013-08-02T21:29:49.567 回答