在我的脚本中,我需要检索字典以将编码值转换为名称:
$.ajax({
// retrieve dictionary
})
.done(function(dictionary){
// convert encoded values into names
})
.done(function(){
// run my application
});
但是,有时字典已被其他应用程序加载,在这种情况下我不需要ajax调用:
if (dictionary) {
// convert encoded values into names
// run my application
}
else {
$.ajax({
// retrieve dictionary
})
.done(function(dictionary){
// convert encoded values into names
})
.done(function(){
// run my application
});
}
这个if / else语句相当重,有没有办法缩短它:
// load dictionary if needed
// then run my application
注意:我使用$ sign作为我的伪代码,但我不一定与jQuery绑定。
答案 0 :(得分:3)
这是我通常使用的模式:
var done = function() {
//continue loading application
}
if(!dictionary) {
$.ajax({
})
.done(done);
} else {
done.apply(this);
}
一个非常类似的模式,总是使用延迟对象,可能如下:
var
dictionaryDeferred = new $.Deferred(),
dictionaryPromise = dictionaryDeferred.promise();
if(!dictionary) {
$.ajax({
})
.done(function() {
//do something with the response
dictionaryDeferred.resolve();
});
} else {
dictionaryDeferred.resolve();
}
dictionaryPromise.then(function() {
//continue loading application
});
答案 1 :(得分:2)
您应该只调用$.ajax()
一次,并将返回的承诺存储在您的(global-ish)dictionary
变量中。
然后,每次要使用结果时,只需写下dictionary.then(...)
如果AJAX请求已经完成,则回调将立即运行。
答案 2 :(得分:0)
也许用$ .when创建一个虚假的承诺?
var promise;
if (dictionary) promise = $.when(dictionary);
else {
promise = $.ajax({
})
.done(function(dictionary){
// convert encoded values into names
});
}
promise
.done(function(){
// run my application
});