Javascript 使用jQuery延迟对象解决许多主干依赖关系

Javascript 使用jQuery延迟对象解决许多主干依赖关系,javascript,jquery,backbone.js,Javascript,Jquery,Backbone.js,我有一个相当大的Backbone.js项目,所以我希望延迟加载尽可能多的资源 考虑一个需要加载自己模板的视图、一些子视图模板和一个集合。(我不希望在请求下一个异步依赖项之前必须等待每个异步依赖项都得到解决。)如果我能做一些类似于 initialize: function() { $.when([ Handlebars.get('Template1', callback), // callback sets this.template Handlebars.g

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

这会引起什么问题吗?有更好的方法吗

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


但是,如果项目实际上比要加载的几个模板更复杂,那么您可能应该考虑一些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
  }
}

不,这没什么错。不过,如果将实际的延迟对象存储在缓存中,则可以返回已解析的旧延迟对象,而不是创建新的延迟对象。我考虑过这一点,但我需要
deferred.reject().done(callback.resolve()
)。你认为会有任何性能提升吗?你不能拒绝它然后解决它。一旦它被拒绝,就无法解决或再次拒绝。我想我需要更新
done
回调,但我可以自己调用回调。我真傻。我想我会得到一个require.js的答案。它似乎对代码库很有侵入性。我会再研究一下。jQuery的
when
whenall
插件有什么区别?如果出现故障,jQuery的when将立即返回,whenall将等到它们全部完成后才返回,而不管其中一个是否失败。我不会使用require.js,因为我需要在加载依赖项之前运行脚本。这样,视图就可以显示加载动画,用户界面看起来也更简洁。这在require中仍然是可能的。您可以先运行一些初始代码,然后调用require:require(dependencies,function(){})。这使得获取返回的数据变得很困难,回调被代理为一个,甚至在后续的
get
s中都不会被调用。