如何使$ .ajaxSetup依赖于后来初始化的backbone.js模型

时间:2013-07-24 08:51:00

标签: jquery backbone.js initialization jquery-deferred

我有以下backbone.js应用程序初始化过程:

var app = {
  init: function(arg) {
    $.when(app.loadStaticFiles('any_file_to_load_before'))
    .done(function(args) {
       app.models.current_user = app.Models.User();
     });
    // ... 
    // initializing the backbone app and models
    // ...
    $.ajaxSetup({
       headers: {Authorization: 'Token token=' + app.models.current_user.get('token')}
    })
  }    
}
$(document).ready(
  function(){
    app.init(args);
  };
);

然后,当应用程序初始化时,$ .ajaxSetup会评估遗忘未定义的app.models.current_user.get('token')

我想我的设计中存在一些误解,我应该如何重写代码以使其正常工作?

我认为主要问题是在$.ajaxSetup()解决方案之前评估$.deferred

1 个答案:

答案 0 :(得分:0)

延迟是为了控制应用程序进程的顺序。从阅读您的问题,您的应用程序的订单似乎需要:

  1. app.loadStaticFiles('any_file_to_load_before')
  2. app.models.current_user = app.Models.User();
  3. $.ajaxSetup(...)
  4. 初始化骨干应用和模型?
  5. 您可以使用deferreds将其写为:

    var app = {
      init: function(arg) {
        $.when(app.loadStaticFiles('any_file_to_load_before'))
          .done(function(args) {
            app.models.current_user = app.Models.User();
          })
          .done(function() {
            $.ajaxSetup({
              headers: {Authorization: 'Token token=' + app.models.current_user.get('token')}
            })
          })
          .done(function() {
            // ... 
            // initializing the backbone app and models
            // ...
          });
       }
    };
    

    需要注意的一个小细节与jQuery隐含的done()回调排序有关。在此代码中,您只执行4个静态步骤。如果您需要特定的排序并动态添加.done()回调,则可能无法确定在其他回调之前添加了哪一个。上面的示例有效,因为jQuery按照添加的顺序运行.done()回调。如果您没有这个假设,则必须通过jQuery的.then()函数代理/过滤每个完成步骤中的延迟。这样每个中间步骤只有1个且只有1个完成的回调,返回另一个延迟,下一个延迟为1,只有1个回调...依此类推。