我有以下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
。
答案 0 :(得分:0)
延迟是为了控制应用程序进程的顺序。从阅读您的问题,您的应用程序的订单似乎需要:
app.loadStaticFiles('any_file_to_load_before')
app.models.current_user = app.Models.User();
$.ajaxSetup(...)
您可以使用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个回调...依此类推。