0

我有以下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

4

1 回答 1

0

延迟用于控制应用程序进程的顺序。通过阅读您的问题,您的应用程序的顺序似乎需要是:

  1. app.loadStaticFiles('any_file_to_load_before')
  2. app.models.current_user = app.Models.User();
  3. $.ajaxSetup(...)
  4. 初始化主干应用程序和模型?

您可以使用 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 个 done 回调返回另一个延迟,以便下一个附加 1 并且只有 1 个回调......等等。

于 2013-08-05T21:47:01.900 回答