7

在我的脚本中,我需要检索字典以将编码值转换为名称:

$.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

注意:我在伪代码中使用了 $ 符号,但我不一定与 jQuery 相关联。

4

3 回答 3

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
});
于 2013-09-30T17:00:59.970 回答
3

您应该只调用$.ajax()一次,并将返回的 Promise 存储在您的 (global-ish)dictionary变量中。

然后,每次要使用结果时,只需编写dictionary.then(...).
如果 AJAX 请求已经完成,回调将立即运行。

于 2013-09-30T16:49:27.017 回答
1

也许用 $.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
    });
于 2013-09-30T17:08:45.723 回答