使用jQuery Deferred对象解决许多Backbone依赖项

时间:2013-08-02 21:22:10

标签: javascript jquery backbone.js

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

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

2 个答案:

答案 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
  }
}